2016-05-28 8 views
0

Ich habe eine harte Zeit Rekursion in Eloquent JavaScript zu verstehen, ist es einfach zu wissen, was passiert ist, aber ich kann nicht verstehen, warum ..Eloquente JavaScript Rekursion zurück?

function power(base, exponent) { 
if (exponent == 0) 
return 1; 
else 
return base * power(base, exponent - 1); /* 2*2*2, this returns only base? 
i thought at first it was, 2*(2,3-1) so it would return 2*(2,2)? 
calling itself until reach 0, so why exponent is out?*/ 
} 

console.log(power(2, 3)); 
// → 8 
+0

es tatsächlich tut '2 * 2 * 2 * 1 ' – 4castle

+0

ja, warum? Warum wird der fallende Exponent dort nicht gedruckt? –

+0

@GlendonPhilippBaculio: Was meinst du mit "nicht gedruckt"? Das einzige, was Sie drucken, ist das Ergebnis "8". – Bergi

Antwort

2

Rekursive Funktionen können oft als Schleife ausgedrückt werden. Sehen Sie diese Anpassung:

function power(base, exponent) { 
    var result = 1; 
    for (var i = 0; i < exponent; i++) 
     result *= base; 
    return result; 
} 

Wie Sie sehen können, ist der Exponent keine Rolle spielen überhaupt in dem, was ausgegeben wird, es stellt nur die Anzahl der Schleifen zu machen.

In der Welt der Rekursion gibt der Exponent an, wie oft die Funktion sich noch selbst aufrufen muss, bevor sie zurückkehren kann.

Dieses YouTube-Video visualisiert Rekursion schön: Computerphile

+0

Ich wusste nicht, dass es auch im Gegenzug verwendet, vor allem in einer Funktion –

+1

@Glendon Ich glaube nicht, dass Sie Rekursion durch das Verständnis von Schleifen vollständig verstehen können. Rekursion benötigt den Stack! – rand

+0

@Iven Absolut, aber in diesem Fall sind Loops ein großartiges Lehrmittel, da sie ein vertrautes Konzept verwenden, um eine Analogie zu bilden. Die Analogie ist natürlich nicht perfekt, sonst würde Rekursion nicht existieren. – 4castle

0

Die Rekursion in der Frage ist:

p(n) = base * p(n-1) 
Expanding, p(n-1) = base * p(n-2) 
Expanding, p(n-2) = base * p(n-3) 
And so on.. till 
p(1) = base * p(0) 
Effectively, it becomes, 
p(n) = base * base ..........n times * 1 
1

Zuerst bilden die rekursiven Funktionsaufrufe den Stapel. Jeder rekursive Aufruf reduziert den Exponenten um eins, bis der Basisfall erreicht ist. Der Basisfall erfordert den Exponenten Null ist, und gibt ein:

power(2,3) 
2 * power(2,2) 
    … 2 * power(2,1) 
     … 2 * power(2,0) 
      … 1 // base case is reached 

Zweitens, wenn die maximale Rekursion Tiefe erreicht ist, wird der Stapel abgerollt. An dieser Stelle findet die eigentliche Berechnung statt:

2 * power(2,0) becomes 2 * 1 = 2 is returned 
2 * power(2,1) becomes 2 * 2 = 4 is returned 
2 * power(2,2) becomes 2 * 4 = 8 is returned 

Fertig, keine Stapelbilder mehr. 8 ist das Endergebnis!

+0

Ich bekomme das, warum ist der Stapel abgewickelt? es ist mir nicht klar, und aus dem Kommentar ist es interner Zähler? –

+0

Wenn 'exponent' '0' ist, wird der Basisfall erreicht: if (Exponent == 0) return 1; '. Dies beendet den rekursiven Prozess, denn anstatt "power" ein anderes Mal aufzurufen, gibt es nur '1' zurück. – rand

+0

@Bergi: Danke, viel klarer! – rand

Verwandte Themen