【发布时间】:2019-02-18 20:58:25
【问题描述】:
我一直在研究 Codewars 的一个 kata,挑战是编写一个函数,持久性,它接受一个正参数 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
在尝试解决这个问题时,我在网上找到了一个解决方案(如下所示),在尝试了解其逻辑后,我看不出为什么代码不起作用
var count = 0;
function persistence(num) {
if (num.toString().length === 1) {
return count;
}
count++;
var mult = 1;
var splitStr = num.toString().split("");
for (var i = 0; i <= splitStr; i++) {
mult *= parseFloat(splitStr[i])
}
return persistence(parseFloat(mult));
}
任何一位数字的输出都是 0,这是正确的,但是对于任何多位数的数字,持久性总是记录为 1,我似乎无法弄清楚为什么,任何帮助将不胜感激。
【问题讨论】:
-
如果您要问为什么第二段代码会这样,最好不要通过显示其他代码来混淆问题。此外,两段代码都使用
for循环,均未显示while.... -
另外,发布的代码会产生不同的结果,因为
count仅在第一次运行时设置为 0... -
第二个函数不好,它依赖于全局变量
count,所以它根据调用的时间给出不同的结果。应该重写为return 0和return 1 + persistence(...)并且根本不使用全局count。 -
我在 Stack Overflow 上遇到了这里提出的解决方案 - 一个链接可能会有用。另外,你问为什么别人的代码不起作用?
-
@HereticMonkey 抱歉,我发布了错误的代码,但我现在已将其删除,因为我知道它为什么会令人困惑。
标签: javascript