2016-11-15 104 views
-1

我想寫一個函數(持久化),它接受一個正參數num並返回它的乘法持久性,這是你必須在num中乘以數字的次數,直到達到一個數字。 例如:遞歸閉包返回什麼?

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 

我寫了這個:

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;} 
    } 

} 

,你可以看到運行此代碼,內部函數的返回值不完全是預期的。 確實,函數應該返回到它被調用的地方,對吧?但在這種情況下,因爲它是遞歸的,所以它是從本身調用的。 我不知道如何檢索實際值(不使用全局變量)

+0

FYI:arguments.callee的已被棄用.... – epascarello

回答

0

當您遞歸調用內部函數時,不會返回值。你可以解決它像這樣(去除else塊,並使其成爲通用代碼),所以總是被返回的count的最後更新值:

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

arguments.callee已過時,而且你正在使嵌套函數過於複雜。

你可以這樣說:

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

哦!這是簡單的方法!謝謝 :) –

0

不必返回在遞歸線

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

正如我在評論arguments.callee的規定已經過時,所以你應該使用函數名稱。

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