rekursive Lösung zum Potenzieren einer Zahl

Miasto71

Grünschnabel
Hallo Leute,

ich habe eine Frage zu einem Quellcode..und zwar wird im folgenden Code eine beliebige Zahl a mit b potenziert.

public static long potenzieren(int a, int b){
if(b==0){
return 1;
}

else{
return(potenzieren(a,b-1)*a);
}


Z.B wird 10 mit 3 potenziert, dass Ergebniss ist ja dann 1000;

wie genau bearbeitet das Programm diesen Code ab?

den IF-Zweig habe ich verstanden wenn b am Anfang der Initialisierung 0 ist wird einfach eine 1 ausgegeben

aber wie geht es weiter?

soll man in dem Else-Zweig wie folgt nachgehen 10*10, (3-1)*10 usw.;


könnte mir einer den Else Zweig dieses Codes erklären?


Ich danke im voraus :)
 
Hi

Das mit dem if...return 1 ist deswegen in Ordnung, weil es eine mathematische Regel ist.
Hat mit der Programmiersprache etc eigentlich überhaupt nichts zu tun, das wird auch auf dem Papier so gerechnet.
x hoch 0 ist immer 1.
Deshalb: Wenn der Exponent (hier die Variable b) 0 ist, wird einfach 1 zurückgegeben, ohne viel herumzurechnen.

Zum Ablauf:
Angenommen, es soll 8 hoch 2 berechnet werden: potenzieren(8,2)

-startet die erste Instanz der Funktion mit a=8 und b=2
-b ist nicht 0, also wird beim else weitergemacht
-Jetzt wird bei den Klammern von innen nach außen gearbeitet
-dh bei "return(potenzieren(a,b-1)*a);" kommt zuerst "b-1" dran
-b ist 2, "b-1" also 1; ergibt return(potenzieren(a,1)*a);
-a noch einsetzen: "return(potenzieren(8,1)*a);

Jetzt wird potenzieren mit a=8 und b=1 aufgerufen
Ergibt die zweite Instanz der Funktion; die wird wieder ganz normal komplett abgearbeitet
Die erste Ausgabe vom Ganzen, die ja jetzt eine zweite startet, wartet bis die zweite fertig ist.

--Dh die zweite Instanz der Funktion mit a=8 und b=1 wird gestartet
--b ist nicht 0, also wird beim else weitergemacht
--"return(potenzieren(a,b-1)*a);"
--b ist 1, "b-1" also 0; ergibt return(potenzieren(a,0)*a);
--a noch einsetzen: "return(potenzieren(8,0)*a);
--jetzt startet die zweite Instanz noch eine Dritte mit a=8 und b=0 und wartet wiederrum, bis die fertig ist
---Die dritte Instanz der Funktion mit a=8 und b=0 ist gestartet
---Weil b 0 ist, wird beim if jetzt 1 zurückgegeben
---Instanz 3 ist damit fertig und die Zweite kann weitermachen
--Die Zweite wartet mit "return(potenzieren(8,0)*a);"
--"potenzieren(8,0)" hat 1 zurückgegeben, also ist es jetzt "return(1*a);
--ergibt "return(1*8);" ist "return(8);" und damit fertig, 8 wird zurückgegeben
-Jetzt kann die Erste Instanz weiterarbeiten, hat 8 zurückgekommen
-also wird aus "return(potenzieren(8,1)*a);" -> "return(8*a);" -> "return(8*8);" -> "return(64);"
-Fertig, 64 wird zurückgegeben
-Alles fertig
 
Hi Sheel,

vielen Dank für deine ausführliche Erklärung habe es jetzt teilweise verstanden,

könntest du dein Beispiel mal mit einem Parameter von z.B. 8 und 3 berechnen.

Wie sieht es dann mit der Berechnung aus

Hier hast du ja mit (8,1)gerechnet :

"also wird aus "return(potenzieren(8,1)*a);" -> "return(8*a);" -> "return(8*8);" -> "return(64);"
-Fertig, 64 wird zurückgegeben"

was wäre wenn in der funktion (potenzieren(8,2)*a) stehen würde, wie sollte man dann vorgehen ****?

danke im voraus
 
Nein, nicht 8/1, ich hab mit 8 und 2 angefangen :)

Nocheinmal verkürzt das Ganze:
Du rufst die Funktion mit 8/2 auf
-damit ist sie das erste mal gestartet mit 8/2
-b ist nicht 0, also wird die Funktion wieder mit 8 und 1 gestartet (b-1=2-1=1)
--Der zweite Start: 8/1, b ist wieder nicht 0, also:
---Wird noch ein drittes Mal gestartet mit 8/0 (b-1=1-1=0)
---b ist jetzt 0, also wird 1 zurückgegeben, fertig
--Zweiter Durchgang kann jetzt weitermachen
--Der multipliziert das zurückgegebene noch mit a, dh 1*a=1*8=8 und gibt 8 selber zurück, fertig
-Erster (Ursprünglicher) Durchgang macht weiter, Returnwert*a=8*8=64, gibt 64 zurück
Die gesamte rekurive potenzieren-Funktion ist jetzt Fertig, 8 hoch 2 hat 64 ergeben

Wenn du jetzt die Funktion statt mit 8/2 mit 8 und 3 aufrufst:
-b ist nicht 0
-potenzieren mit a und b-1 wird gestartet, ist potenzieren(8,2)
--potenzieren(8,2) ist genau das oben beschriebene, gibt 64 zurück
-Der 8/3-Durchgang multipliziert noch a dazu, 64*8=512 und gibt das zurück

Wenn du jetzt die Funktion mit 8 und 34 aufrufst:
-b ist nicht 0
-potenzieren mit a und b-1 wird gestartet, ist potenzieren(8,3)
--potenzieren(8,3) ist wiederrum oben beschrieben, gibt 512 zurück
-Der 8/4-Durchgang multipliziert noch a dazu, 512*8=4096 und gibt das zurück

usw...
 
danke für die Antowort,

ich habe es jetzt verstanden ich muss einfach darauf achten das die einzelnen Instanzen erstmal abgearbeitet werden.

thx
 
Zurück