【发布时间】:2015-06-16 18:16:21
【问题描述】:
在解决一些 Coderbyte 挑战时,我能够递归地解决以下问题,但希望获得一些关于如何改进它的反馈。
让函数 AdditivePersistence(num) 接受传递的 num 参数,该参数始终为正整数,并返回其加法持久性,即您必须在 num 中添加数字直到达到单个数字的次数。
例如:如果 num 是 2718,那么您的程序应该返回 2,因为 2 + 7 + 1 + 8 = 18 和 1 + 8 = 9,然后你在 9 点停止。
我提交的有效递归解决方案如下。如何在每次递归时将“计数”放入我的函数中而不让它“重置”?
var count = 0;
function AdditivePersistence(num) {
count = 0;
if (num < 10) {
return count;
}
if (num > 10) {
count++;
AdditivePersistence('' + num.split("").reduce(function(a,b) {
return parseInt(a) + parseInt(b)
}));
}
}
这是我在函数内移动计数器的失败尝试......希望为我的初学者自己提供任何指点。除了修复代码之外,如果还有其他解决这个难题的好方法,我会很高兴!
function AdditivePersistence(num) {
var count = 0;
(function recurse(num) {
if (num < 10) {
return count;
}
if (num > 10) {
count++;
recurse('' + num.split("").reduce(function(a,b) {
return parseInt(a) + parseInt(b);
}));
}
})();
return count;
}
编辑:我刚刚尝试了下面的 while 循环
function AdditivePersistence(num) {
var count = 0;
while (num >= 10) {
count++
num = num.toString().split('').reduce(function(a,b) {
return parseInt(a) + parseInt(b);
})}
return count;
}
提前非常感谢!
【问题讨论】:
-
使用尾递归(即,将“累加器”变量作为递归函数的最后一个参数传递)。
-
在您的第一个代码块中,您通过重新声明它来隐藏外部计数变量。
-
你的问题是
var count = 0;的范围,你以某种方式期望它是全球性的。 -
请注意
num < 10和num > 10并未涵盖num的所有可能值。 -
大家好 - 很抱歉,我的实际代码没有在函数(第一个代码块)中声明计数 - 这是我转移到这里的错误,抱歉。
标签: javascript algorithm recursion