递归闭包返回什么?
what does a recursive closure returns to?
我想写一个函数(持久性),它接受一个正参数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;}
}
}
运行这段代码可以看到,内部函数的返回值并不完全是预期的值。实际上,函数应该返回到调用它的地方,对吗?但在这种情况下,由于它是递归的,它是从自身调用的。我不知道如何检索实际值(不使用全局变量)
递归调用内部函数时不返回值。您可以这样修复它(删除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
您没有在递归行返回
return arguments.callee(numt[numt.length-1]);
和如我在注释中所述的参数。Callee已弃用,所以您应该使用函数名。
return g(numt[numt.length-1]);
相关文章:
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 它将返回什么新日期(DateObject)
- 无法在ajax调用中发布绝对文件路径-无论我做什么,它都会返回斜杠
- 如果我返回表,检查 Ajax 调用是否为 200 OK的最佳方法是什么
- mongodb中db.collection.find()的返回类型是什么
- 什么'这是返回元素的好方法's路径
- 返回多个变量的 JavaScript 函数:数组与对象.最佳实践是什么
- 如果statusCode不是200,那么从http调用返回什么类型的错误对象
- 什么's是jQuery选择器返回的包装集的类型
- 绑定返回的结果和使用function()的结果之间有什么区别
- 在JavaScript中调用array()作为构造函数时,返回的是什么类型的数组
- nan在C++中是什么意思?为什么pow(-4,-2.1)返回-nan
- 使用点击返回功能和不使用它有什么区别
- CoffeeScript - 这个奇怪的“返回”事件是什么意思
- 为什么当我们把Math.floor写成HTML angular时,它什么也不返回
- 访问javascript对象的属性返回undefined,原因是什么
- 在jQuery中返回promise()或deferred有什么区别
- Prototype.js 1.7:将collect与显式函数一起使用会返回与内联函数不同的结果,原因是什么
- “function(){ 返回这个 }()” 作为参数做什么
- ajax表单提交使用什么返回类型