2016-12-01 2 views
0
 I want a recursive function that returns the powers of a number and stores each of them in an array called *stack*. 

Mit anderen Worten, jedes Mal, wenn die Rekursion ausgeführt wird, wird ein neuer Wert zum Stapel hinzugefügt. Wenn wir zum Beispiel power(3, 3) aufgerufen haben, sollte unser Stack mit den Elementen [3, 9, 27] enden.Rekursion in Javascript machen Array, von Codeacademy

Das Ergebnis dieses Codes ist jedoch 27 anstelle des Arrays. Was ist mein Fehler?

// Create an empty array called "stack" 
var stack = []; 
// Here is our recursive function 
function power(base, exponent) { 
    // Base case 
    if (exponent === 0) { 
     return 1; 
    } 
    // Recursive case 
    else { 
     stack[exponent - 1] = base * power(base, exponent - 1); 
     return stack[exponent - 1]; 
    } 
} 
power(3,3); 
+0

Bitte bearbeiten Sie den Code zu verwenden, richtiges indenta tion. Es ist sehr schwer zu lesen. –

+0

Ich schätze die Zeit und die Lösungen aller, aber ich habe für das gestimmt, was ich verstehen kann. Andere Codes Ich brauche Zeit zum Lernen, seit ich ein Anfänger bin. Vielen Dank! Außerdem muss es eine Rekursion sein, da ich Rekursion studiere, aber immer noch nicht verstehen kann, wie und wann ich sie benutze, obwohl ich mehrmals eloquentes JavaScript gelesen habe. –

+0

Ich meinte eloquente JavaScript-Rekursion Teil –

Antwort

0

Tatsächlich geben Sie das Array nicht zurück, aber das zuletzt berechnete Produkt. Das Ergebnis, nach dem Sie suchen, wird nach dem Anruf in Stapel gespeichert.

Aber es ist eine schlechte Übung, eine globale Variable zu haben, die von einer Funktion mutiert wird. Stattdessen erstellen Sie einen so genannten Verschluss für sie, und nennt es Kräfte (Plural, um anzuzeigen, Sie von ihm ein Array erhalten):

function powers(base, exponent) { 
 
    // Create an empty array called "stack" 
 
    var stack = []; 
 
    // Here is our recursive function 
 
    function power(base, exponent) { 
 
     // Base case 
 
     if (exponent === 0) { 
 
      return 1; 
 
     } 
 
     // Recursive case 
 
     else { 
 
      stack[exponent - 1] = base * power(base, exponent - 1); 
 
      return stack[exponent - 1]; 
 
     } 
 
    } 
 
    power(base, exponent); 
 
    return stack; 
 
} 
 
console.log(powers(3,3));

etwas kompakter gestaltet:

function powers(base, exponent) { 
 
    var stack = []; 
 
    (function power(exponent) { 
 
     return +!exponent || (stack[--exponent] = base * power(exponent)); 
 
    })(exponent); 
 
    return stack; 
 
} 
 
console.log(powers(3,3));

1

Es n o Problem mit Ihrem Code. Das einzige Problem ist der Rückgabewert. Sie unten sehen (BTW, ich habe minimierte Code wenig)

var task = (() => { 
 
    var stack = []; 
 
    function power(base, exponent) { 
 
    return (exponent && (stack[--exponent] = base * power(base, exponent))) || 1; 
 
    } 
 
    power(3, 3); 
 
    return stack; 
 
}); 
 
console.log(task());

Ich bin nicht Fan von rekursiven Anrufe persönlich und ich es vorziehen, nicht dieses Muster verwenden, es sei denn ist ein "muss" -Fall.

Also, in Ihrem Fall (Lassen Sie uns vergessen, es ist von Codeacademy und lassen Sie uns darüber nachdenken, es ist eine Art von realen Leben) mit einer rekursiven Funktion ist nicht zwingend erforderlich.

Es gibt viele Möglichkeiten, die obigen Ergebnisse zu erzielen.

Zum Beispiel klassische for-Schleife:

function power(base, exp){ 
 
    var result = []; 
 
    for(var i=1; i<=exp; i++){ 
 
    result.push(Math.pow(base, i)); 
 
    } 
 
    return result; 
 
} 
 
console.log(power(3, 3));

Oder ES6 Generatoren (vielleicht?)

function *power(base, exp){ 
 
    let prev = 1; 
 
    for(var i=0; i<exp; i++){ 
 
    yield prev *= base; 
 
    } 
 
} 
 

 
console.log([...power(3, 3)]);