我想写一个函数(持久性),它接受一个正参数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 :(得分:0)
你没有在递归线上返回
return arguments.callee(numt[numt.length-1]);
正如我在评论中所述,不推荐使用arguments.callee,因此你应该使用函数名。
return g(numt[numt.length-1]);
答案 1 :(得分: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