Schleife macht ärger

Status
Nicht offen für weitere Antworten.

assault

Aktives Mitglied
Hi also folgendes, die Aufgabe ist es eine Schleife ohne Schleife zu proggen
und zwar soll das so funktionieren das ich ne Prozedur zu sich selbst weiterleite.

so hab ich jetzt gemacht funtzt eigentlich, aber sobald ich die Variable n2 zurück geben möche über die return anweisung fängt die return anweisung an alles 'zurück zu Spulen'... und es kommt ein falschen ergebnis... obwohl das Ergebnis innerhalb der Schleife richtig ermittelt wurde



Code:
public class fakultaet_iteraktive {

	public static void main (String[]ages){
		
                                int n= IO.promptAndReadInt("Bitte Zahl eingeben: ");
		int n2 = 1;
		
                                System.out.println(fak ( n, n2));
	}
	
	public static int fak (int n1, int n2){
	
                 n2 = n2 * n1;
	n1= n1 -1;
	
                if(n1>0){fak ( n1, n2);}
	
                return n2; 
	

	}
	
}


probiert es mal selbst aus wenn ihr 3 eingebt muss 6 rauskommen und bei 5 -> 120[/quote]
 
S

SlaterB

Gast
schau dir dochmal ne halbe Sekunde deinen Code an:
> if(n1>0){fak ( n1, n2);}

hier rufst du fak nochmal auf (heißt übrigens 'Rekursion')
verwendest aber den Rückgabewert nicht,
der Aufruf ist damit völlig sinnlos, kannst ihn genausogut weglassen,


--------

schreibe dir erstmal auf Papier/ in deutscher Sprache auf, was die Operation allgemein leisten soll und wie du das ungefähr in Code umsetzen willst,
z.B. welchen Sinn der rekursive Aufruf haben soll
 

assault

Aktives Mitglied
SlaterB hat gesagt.:
schau dir dochmal ne halbe Sekunde deinen Code an:
> if(n1>0){fak ( n1, n2);}

hier rufst du fak nochmal auf (heißt übrigens 'Rekursion')
verwendest aber den Rückgabewert nicht,
der Aufruf ist damit völlig sinnlos, kannst ihn genausogut weglassen,

Sorry aber versteh nicht ganz wo der Fehler sein soll :bahnhof: die rekursion soll ja sein und der soll mir doch den n2 wert ausgeben. ???:L
 
S

SlaterB

Gast
na gut, dann eben mal eine fertige Version, ist ja nur ne kleine Änderung,
mehr erklären kann ich dazu aber nicht

edit: halt,
> und der soll mir doch den n2 wert ausgeben
wenn n2 in den rekursiven Aufrufen weiter erhöht wird, dann ändert das nicht die n2-Variable im ersten Aufruf,



-----------


Code:
public class Test
{
    public static void main(String[] args)
    {
        int n2 = 1;
        for (int n = 1; n < 10; n++)
        {
            System.out.println(n+" -> "+fak(n, n2));
        }
    }

    public static int fak(int n1, int n2)
    {

        n2 = n2 * n1;
        n1 = n1 - 1;

        if (n1 > 0)
        {
            return fak(n1, n2);
        }
        return n2;
    }

}
 

assault

Aktives Mitglied
Danke erstmal also lag es daran das ich dieses return da nicht stehen hatte... (vor dem fak(n1, n2);)
was biwirkt den das return? ich meine reicht es denn nicht aus wenn ich einfach nur die n2 wieder gebe? ausserdem dachte da dürfte überhaupt kein "return" hin weil ich zu dem zeitpunkt doch keine wertausgabe haben möchte sondern nur die schleife wieder aufrufen will... sorry wenn die frage blöd ist aber in dem buch wird das leider nicht erklärt :(
 

Maeher

Bekanntes Mitglied
Ich glaube du bist davon ausgegangen, dass der Aufruf von fak(n1,n2) die Variable n2 in der aufrufenden Methode verändert.
int-Variablen werden jedoch immer als Kopie übergeben, das heißt jeder Methodenaufruf erzeugt ein neues n2, das ursprüngliche n2 verändert sich nicht, wenn du es nicht ausdrücklich mit dem Rückgabewert überschreibst (d.h. n2=fak(n1,n2) ).
 
S

SlaterB

Gast
oh ja,
if (n1 > 0)
{
n2 = fak(n1, n2);
}
return n2;

wäre sicherlich stilistisch schöner nachzuvollziehen,
direkt ein return dieses Wertes kommt natürlich auf das gleiche hinaus
 

assault

Aktives Mitglied
Maeher hat gesagt.:
Ich glaube du bist davon ausgegangen, dass der Aufruf von fak(n1,n2) die Variable n2 in der aufrufenden Methode verändert.
int-Variablen werden jedoch immer als Kopie übergeben, das heißt jeder Methodenaufruf erzeugt ein neues n2, das ursprüngliche n2 verändert sich nicht, wenn du es nicht ausdrücklich mit dem Rückgabewert überschreibst (d.h. n2=fak(n1,n2) ).

ok habs nu verstanden, ein großes Dankeschön an euch zwei *g*
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben