2016-11-15 2 views
-1

Ich möchte eine Funktion (Persistenz) schreiben, die einen positiven Parameter num aufnimmt und ihre multiplikative Persistenz zurückgibt. Dies ist die Anzahl der Male, die Sie die Ziffern in num multiplizieren müssen, bis Sie eine einzelne Ziffer erreichen. Zum Beispiel:Worauf kehrt sich eine rekursive Schließung zurück?

persistence(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4 
         // and 4 has only one digit 

persistence(999) === 4 // because 9*9*9 = 729, 7*2*9 = 126, 
         // 1*2*6 = 12, and finally 1*2 = 2 

persistence(4) === 0 // because 4 is already a one-digit number 

ich dies schrieb:

function persistence(num) { 
    //code me 
    var f; 
    f= countPersistence(num); 
    var toReturn= f(num); console.log("received value: "+toReturn); 
    return toReturn; 
} 

function countPersistence(num){ 
    var count=0; 
    return function g(num){ 
    var numt=num+""; 
    numt=numt.split(""); 
    if(numt.length>1){ 
     count++; 
     for(var i=0; i<numt.length-1; i++){ 
     numt[i+1]=numt[i]*numt[i+1]; 
     } 
     arguments.callee(numt[numt.length-1]); 
    } 
    else 
     { console.log("returned value: "+count); return count;} 
    } 

} 

Wie Sie diesen Code ausgeführt wird sehen können, der zurückgegebene Wert der inneren Funktion nicht genau das, was erwartet wird. Tatsächlich sollte eine Funktion dorthin zurückkehren, wo sie aufgerufen wird, richtig? Aber in diesem Fall, da es rekursiv ist, wird es von sich selbst aufgerufen. Ich habe keine Ahnung, wie der tatsächliche Wert abgerufen werden (ohne globale Variable)

+0

FYI: arguments.callee veraltet .... – epascarello

Antwort

0

Sie geben keinen Wert zurück, wenn Sie Ihre innere Funktion rekursiv aufrufen. Man könnte es so fixieren (den else Block entfernt und gemeinsamen Code zu machen), so dass immer der letzte aktualisierte Wert von count zurückgegeben wird:

function persistence(num) { 
 
    //code me 
 
    var f; 
 
    f= countPersistence(num); 
 
    var toReturn= f(num); 
 
    return toReturn; 
 
} 
 

 
function countPersistence(num){ 
 
    var count=0; 
 
    return function g(num){ 
 
    var numt=num+""; 
 
    numt=numt.split(""); 
 
    if(numt.length>1){ 
 
     count++; 
 
     for(var i=0; i<numt.length-1; i++){ 
 
     numt[i+1]=numt[i]*numt[i+1]; 
 
     } 
 
     arguments.callee(numt[numt.length-1]); 
 
    } 
 
    return count; 
 
    } 
 
} 
 

 
console.log(persistence(39)); // 3 
 
console.log(persistence(999)); // 4 
 
console.log(persistence(4)); // 0

Aber arguments.callee ist veraltet, und darüber hinaus Sie machen Dinge mit verschachtelten Funktionen zu kompliziert.

Sie können es wie folgt tun:

function persistence(num){ 
 
    return num < 10 ? 0 
 
     : 1 + persistence(String(num).split('').reduce((a, b) => a*b)); 
 
} 
 

 
console.log(persistence(39)); // 3 
 
console.log(persistence(999)); // 4 
 
console.log(persistence(4)); // 0

+0

Oh! das ist viel einfacher! Vielen Dank :) –

0

Sie sind nicht auf der Rekursion Linie Rückkehr

return arguments.callee(numt[numt.length-1]); 

und als ich in den Kommentaren arguments.callee angegeben ist, so dass Sie veraltet sollte den Funktionsnamen verwenden.

return g(numt[numt.length-1]);