# Schleife macht ärger



## assault (26. Mrz 2008)

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 




```
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]


----------



## SlaterB (26. Mrz 2008)

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 (26. Mrz 2008)

> SlaterB hat gesagt.:
> 
> 
> 
> ...


----------



## SlaterB (26. Mrz 2008)

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,



-----------



```
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 (26. Mrz 2008)

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 (26. Mrz 2008)

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) ).


----------



## SlaterB (26. Mrz 2008)

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 (26. Mrz 2008)

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*


----------

