Methoden Methodenaufrufe zählen

Hallo Leute,
ich habe gerade ein Methode geschrieben die rekursiv ist, sich also immer wieder selber aufruft. Mein Problem ist, das ich einen Zähler einbauen möchte, der zählt ,wie oft der Algorithmus angewendet wurde:

[Java]
public class Tuerme {
public static void main(String[] args){
(...)
}

private static void bewege(int i,HanoiTurm a,HanoiTurm b,HanoiTurm c) {
if(i>0){
bewege(i-1,a,c,b);
c.push(a.top()); //das soll gezählt
a.pop(); //werden
bewege(i-1,b,a,c);
}
}
}
[/Java]

mit einer einfachen Variable geht das nicht, da sie ja bei jedem Aufruf initialisiert wird. Muss ich einen Zähler als Parameter mit übergeben? Oder What?
 

rme

Top Contributor
Das mit dem Parameter wäre eine Möglichkeit, ja. Du könntest aber auch eine Klassenvariabe einführen und außerhalb zählen, d.h. eine static-Variable in der Klasse anlegen und diese hochzählen.
 
also mit der Klassenvariable kriege ich das irgendwie nicht hin, könntest du da ein Beispiel formulieren? Und wenn ich den Zaehler als Parameter übergebe, wie kann ich ihn dann ausgeben? in der Methode selber würde er dann ja bei jedem Aufruf ausgegeben werden, und in der main Methode ist er immer noch auf den Startwert gesetzt.
 

rme

Top Contributor
Zur Verwendung von Klassenvariablen siehe hier: http://www.java-forum.org/java-basi...856-zugriff-package-struktur.html#post1001604

Bei der Variante mit Parametern: Du könntest der Methode einen Rückgabewert gegeben, d.h. sie könnte die Anzahl der Rekursionen zurückgeben, sodass du in main darauf zugreifen kannst. Dabei müsstest du allerdings darauf achten, dass du die Rückgaben der beiden Rekursionen speicherst und dann die Summe zurückgibst.
 
Da die Methode sich aber immer wieder selbst aufruft, kann ich darin doch gar nichts summieren, sie gibt ja dann bei jedem Aufruf etwas zurück und wird bei jedem Aufruf neu initialisiert.
 

rme

Top Contributor
Sie gibt es an den Aufrufer zurück, der zählt zusammen und addiert 1 (für den eigenen Aufruf), gibt das wiederum an den Aufrufer zurück, der wieder 1 hinzuzählt ... bis irgendeiner die Gesamtsumme an main zurückgibt :)
 
Tut mir leid, wenn ich grade etwas schwer von Begriff bin:autsch: Mir brennt nur gerade der Helm, ich sitze da schon so lange vor und muss bald fertig werden :-D
Wenn ich den Zähler so als Parameter einbaue bekomme ich nur 1 zurück in die main-Methode...
Java:
private static int bewege(int i,HanoiTurm a,HanoiTurm b,HanoiTurm c,int zaehler) {
       if(i>0){
	   bewege(i-1,a,c,b,zaehler);
	   c.push(a.top());  
	   a.pop();          
	   bewege(i-1,b,a,c,zaehler);	   
       }
       return ++zaehler; //der Methodenaufrufzaehler wird um einen erhöht
    }
 
Zuletzt bearbeitet:

rme

Top Contributor
Jeder Aufruf von bewege (du hast 2 davon) erzeugt eine Kette an rekursiven Aufrufen. Du nutzt die Anzahl der dort gemachten Aufrufe aber nicht. Die beiden Aufrufe von bewege geben auch jeweils eine Zahl von Unteraufrufen zurück, die musst du beide addieren, dann noch 1 hinzu und zurückgeben.
 
Java:
private static int bewege(int i,HanoiTurm a,HanoiTurm b,HanoiTurm c,int zaehler) {
	
       if(i>0){
	   zaehler=zaehler+bewege(i-1,a,c,b,zaehler);  
	   c.push(a.top());  //auf Stab c wird die oberste Scheibe von a gesetzt
	   a.pop();          //die oberste Scheibe wird gelöscht
	   zaehler=zaehler+bewege(i-1,b,a,c,zaehler);
       }
       return ++zaehler;
    }

da kommt -387008604(hab bestimmt nen überlauf der int Variable) raus. Das kann nicht stimmen. Ich weiß nicht, wie ich sonst die Rückgabewerte der rekursiven Methoden summieren soll:noe:
 
Zuletzt bearbeitet:
Das ist das ganze Ding. Ich möchte, dass er mir einfach nur die benütigten Züge ausgibt, das kann doch nicht so kompliziert sein:rtfm::rtfm::rtfm::bloed:

Java:
class HanoiTurm {
    /*
     * jede Scheibe wird durch einen String dargestellt je laenger der String,
     * derst groesser ist die Scheibe in values werden somit die Scheiben
     * abgelegt
     */
    private String[] values;
//   position gibt die Position der obersten Scheibe an
    private int position;

//   Konstruktor(keine Scheibe vorhanden, Stabgroeße ist 1)
    public HanoiTurm() {
	position = -1;
	values = new String[1];
    }

//   Konstruktor(keine Scheibe vorhanden, Stabgroesse wird gesetzt)
    public HanoiTurm(int groesse) {
	position = -1;
	values = new String[groesse];
    }

//   gibt die max Anzahl an Scheiben auf dem Stab zurueck.
    public int maxSize() {
	return values.length;
    }

//   Gibt die oberste Scheibe zurück, falls sie nicht vorhanden ist
//   wird eine Fehlermeldung und null ausgegeben.
    public String top() {
	if (position != -1){
	    return values[position];
	}
	else {
	    System.out.println("Der Stab ist leer!");
	    return null;
	}
    }	
//    Die position wird um eins verringert, und stellt somit die verbleibende
//    oberste Scheibe da. Der zu entfernende String wird = null gesetzt.   
    public void pop() {
	if (position==-1) {
	    System.out.println("Keine Scheibe vorhanden");
	}
	else{
	    values[position]= "";
	    position--;
	}
    }
/*
      Es wird geprüft ob der Stab voll ist oder die Scheibe zu
      groß und eine entsprechende Fehlermeldung ausgegeben
      Ist die Scheibe kleiner als die vorhendene oder keine vor
      handen, wird eine neue eingefuegt.
*/      
    public void push(String neu) {
	if (position==values.length-1){
	    System.out.println("Der Stab ist voll");
	}
	if (position != -1 && neu.length() > values[position].length()){
	    System.out.println("Die Scheibe ist zu groß");
	}
	if(position ==-1||neu.length()<values[position].length()){
	    values[position+1]=neu;
	    position++;
	    
	}
    }
    
//   gibt die Position um eins erhöht wieder um die
//   Anzahl an vorhandenen Scheiben zu erhalten. 
    public int size() {
	return position+1;
    }
}

public class TuermeVonHanoi {
    public static void main(String[] args) {
	int groesse; 
	int a=0;
	int zaehler=0;
	groesse = Integer.parseInt(args[0]);
	
//	 Es werden drei neue staebe erzeugt.
	HanoiTurm stab1 = new HanoiTurm(groesse);
	HanoiTurm stab2 = new HanoiTurm(groesse);
	HanoiTurm stab3 = new HanoiTurm(groesse);
	System.out.println("Stabgroesse: " + stab1.maxSize());
	StringBuilder scheibe = new StringBuilder();
	
//	 Die erste Scheibe wird erzeugt und an stab1 uebergeben.
	for (int i = 0; i < groesse; i++) {
	    scheibe.append("/\\");    
	}	
	String scheibeReady =new String(scheibe);
	stab1.push(scheibeReady);
	
//       Die restlichen Scheiben werden erzeugt und an stab1 uebergeben.
	for (int i = 0; i < groesse - 1; i++) {  
	    int ende = (groesse*2)-a;
            int start = (groesse*2-2)-a;
	    scheibe.delete(start, ende);
	    a= a+2;
	    String scheibeReady2 =new String(scheibe);
	    stab1.push(scheibeReady2);    
	}
	zaehler= bewege(groesse, stab1, stab2, stab3,zaehler);
	System.out.println(zaehler);
	
    }
//   Der aus Wikipedia stammende rekursive Algorithmus wird in einer eigenen
//   Methode formuliert. Der Methode werden die Parameter der Scheibenanzahl 
//   und die drei staebe der Klasse HanoiTurm uebergeben.
    private static int bewege(int i,HanoiTurm a,HanoiTurm b,HanoiTurm c,int zaehler) {
	
       if(i>0){
	   zaehler=zaehler+bewege(i-1,a,c,b,zaehler);  
	   c.push(a.top());  //auf Stab c wird die oberste Scheibe von a gesetzt
	   a.pop();          //die oberste Scheibe wird gelöscht
	   zaehler=zaehler+bewege(i-1,b,a,c,zaehler);
       }
       return ++zaehler;
    } 
}
 

rme

Top Contributor
Du zählst momentan jeden rekursiven Aufruf sehr oft mehrfach, weil du in jeder Rekursion erneut zum Zähler hinzuzählst.. man kann das recht leicht beheben, aber ich will dir nicht die Lösung verraten, weil du sonst das Prinzip der Rekursion nicht lernst. Mal dir mal auf, was die Rekursion macht und dann überleg dir, wie man das behebt :)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
T Methodenaufrufe zählen Java Basics - Anfänger-Themen 24
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
M Methodenaufrufe im Konstruktoren Java Basics - Anfänger-Themen 31
M Lange Methodenaufrufe == suboptimales Klassendesign? Java Basics - Anfänger-Themen 5
D Wie baue ich sinnvoll eine Klasse, genauer die Methodenaufrufe auf? Java Basics - Anfänger-Themen 4
D Interfaces und allgemeingültige Methodenaufrufe Java Basics - Anfänger-Themen 6
A Methodenaufrufe von Anonymen Klassen Java Basics - Anfänger-Themen 6
Kenan89 Methodenaufrufe verketten Java Basics - Anfänger-Themen 16
H Methodenaufrufe protokollieren Java Basics - Anfänger-Themen 7
R Methodenaufrufe Java Basics - Anfänger-Themen 15
L Methodenaufrufe Protokollieren Java Basics - Anfänger-Themen 5
G Methodenaufrufe funktionieren nicht Java Basics - Anfänger-Themen 2
L Reihenfolge der Methodenaufrufe Java Basics - Anfänger-Themen 6
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
M Häufigkeit von Wörtern zählen Java Basics - Anfänger-Themen 6
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
D spezifische Knoten in einem Baum zählen Java Basics - Anfänger-Themen 9
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
J Methoden Positive Werte zählen Java Basics - Anfänger-Themen 3
H Buchstaben zählen Java Basics - Anfänger-Themen 9
Poppigescorn Häufigkeit einer zahl zählen Java Basics - Anfänger-Themen 5
HighLife Bestimmte Werte aus Array zählen Java Basics - Anfänger-Themen 15
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
X Game of Life Nachbarn zählen Java Basics - Anfänger-Themen 20
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
S Binärbäume knoten zählen Java Basics - Anfänger-Themen 16
K Counts zählen Java Basics - Anfänger-Themen 23
Kirby.exe Anzahl vorkommender Elemente im Array zählen Java Basics - Anfänger-Themen 9
J Zeichen im String zählen Java Basics - Anfänger-Themen 3
G Binärer Suchbaum Knoten zählen Java Basics - Anfänger-Themen 1
N Zeichen in einem Textfeld zählen und hinterlegen Java Basics - Anfänger-Themen 6
E Knoten eines Baumes unter Bedinung zählen Java Basics - Anfänger-Themen 2
T x Schritte zählen Java Basics - Anfänger-Themen 18
P Schlüsselworte Zählen und Zuweisen von eingelesenen Zahlen Java Basics - Anfänger-Themen 1
A In einem String alle Eigennamen zählen Java Basics - Anfänger-Themen 6
L Baum Knoten zählen Java Basics - Anfänger-Themen 6
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
B Array - die Häufigkeit der Zahl zählen Java Basics - Anfänger-Themen 9
L Vorherige Objekte zählen und ausgeben Java Basics - Anfänger-Themen 11
L Diphthonge zählen... Java Basics - Anfänger-Themen 5
O ELOPS Zählen Java Basics - Anfänger-Themen 1
S Rekursives Zählen einer Zahl Java Basics - Anfänger-Themen 8
X Quick Sort - Vergleichsoperationen zählen Java Basics - Anfänger-Themen 0
K alle Vorkommen einer bestimmten Ziffer in einer Zahl zählen Java Basics - Anfänger-Themen 2
B Collections Java Wörter in String zählen und geordnet ausgeben Java Basics - Anfänger-Themen 10
O Großbuchstaben im Satz zählen Java Basics - Anfänger-Themen 6
S zahl hoch und runter zählen per button Java Basics - Anfänger-Themen 25
N Zählen von Rationalen Werten eines Arrays Java Basics - Anfänger-Themen 10
Y for-Schleife zählen Java Basics - Anfänger-Themen 6
K Probleme mit Sortieren und dem Zählen Java Basics - Anfänger-Themen 13
S Vererbung Objekte von Ober - und Unterklassen zählen Java Basics - Anfänger-Themen 3
F SubString in String zählen Java Basics - Anfänger-Themen 3
C Im Array zählen und verändern Java Basics - Anfänger-Themen 5
O Zählen der while-Scheife Java Basics - Anfänger-Themen 3
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
G Erste Schritte Einen Array absuchen und Buchstaben zählen Java Basics - Anfänger-Themen 17
F Problem mit Tabulatoren bei Zeilen zählen einer Textdatei Java Basics - Anfänger-Themen 17
F Textdatei einlesen und Zeilen zählen Java Basics - Anfänger-Themen 10
D Groß/KleinBuchstaben zählen Java Basics - Anfänger-Themen 21
D Buchstabe zählen/mappen Java Basics - Anfänger-Themen 3
S Anzahl unterschiedlicher Elemente zählen Java Basics - Anfänger-Themen 4
M Hilfe bei Zählen von Farben? Java Basics - Anfänger-Themen 7
R Input/Output Tastenschläge einer Taste zählen Java Basics - Anfänger-Themen 14
J Schleifendurchläufe zählen Java Basics - Anfänger-Themen 4
B Zweidimensionales Array Elemente jeder Spalte zählen Java Basics - Anfänger-Themen 9
T Leerzeichen zählen mit Rekursion Java Basics - Anfänger-Themen 17
H Programm zum Zählen von Zeichen Java Basics - Anfänger-Themen 5
K Kommandozeile zählen Java Basics - Anfänger-Themen 5
J Bits zusammen zählen Java Basics - Anfänger-Themen 4
P Hashtabelle-Häufigkeit von String zählen Java Basics - Anfänger-Themen 2
J Array; Vorkommen zählen Java Basics - Anfänger-Themen 10
T durchlaufene while-Schleifen zählen Java Basics - Anfänger-Themen 3
P Replace zählen Java Basics - Anfänger-Themen 4
A Methoden Gedanken Anstöße zur Realisierung zweier Ideen (Grafisch Sekunden zählen und Frameaufteilung) Java Basics - Anfänger-Themen 18
E Zeichen von Kommandozeilenparameter zählen Java Basics - Anfänger-Themen 6
L Objekte zählen mehrerer Unterklassen Java Basics - Anfänger-Themen 3
J Buchstaben aus String einzeln Zählen Java Basics - Anfänger-Themen 12
J Enum zählen Java Basics - Anfänger-Themen 8
M Automatisch hoch zählen Java Basics - Anfänger-Themen 8
S Zählen Java Basics - Anfänger-Themen 9
V Arraylist: Zählen welcher String am Häufigsten vorkommt Java Basics - Anfänger-Themen 5
A Erste Schritte Datei einlesen und Buchstaben zählen Java Basics - Anfänger-Themen 13
M Von File lesen Buchstaben lesen und zählen - scheitert an der Eingabe Java Basics - Anfänger-Themen 4
B Zählen bestimmter Zeilen einer .txt Java Basics - Anfänger-Themen 7
A Satzeingabe - Vokale zählen Java Basics - Anfänger-Themen 5
G Gleiche Elemente in Feld zählen Java Basics - Anfänger-Themen 13
B Input/Output Wörter zählen & sortieren Java Basics - Anfänger-Themen 9
S Buchstaben/Wörter im String zählen Java Basics - Anfänger-Themen 6
K apache poi - Spalten zählen Java Basics - Anfänger-Themen 4
L Array Sequent Zählen Java Basics - Anfänger-Themen 8
N Bestimmte Zeichen aus Strings zählen Java Basics - Anfänger-Themen 11
C Boolean Wahrheitswert zählen Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben