2016-11-15 82 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]);