我想递归求和一个整数:将一个整数拆分为一个数组,然后对各个项求和,直到剩下单个整数数组为止。
这是我的逻辑
function digital_root(n) {
let digits = (""+n).split("").map(Number);
while (digits.length > 1) {
let result = digits.reduce((sum, int) => sum + int);
let digits = (""+result).split("").map(Number);
}
return digits;
};
这是我的Node.js遇到的错误代码(在上面的示例代码的第4行):
ReferenceError: digits is not defined
at digital_root (repl:6:18)
我假设可以在while循环的范围内访问变量digits
,但是显然,我似乎错了吗?有人可以在这里为我提供一些见识吗?
编辑:谢谢大家的帮助!我已经解决了这个问题。
为了您的好奇心,这是我的算法所基于的数学形式:
http://mathworld.wolfram.com/DigitalRoot.html
也可以在一行中解决它:
function digital_root(n) {
return (n - 1) % 9 + 1;
}
答案 0 :(得分:2)
请勿以这种方式设置digits
,循环内的digits
前面不应有let
,因为您已经在循环外定义了digits
循环。
这将为您带来预期的结果:
digital_root = n => (Array.from(`${n}`)).reduce((sum, val) => sum + ~~val, 0);
console.log(digital_root(12345));
希望这会有所帮助,
答案 1 :(得分:2)
内部的数字字母(第5行)应该删除
function digital_root(n) {
let digits = (""+n).split("").map(Number);
while (digits.length > 1) {
let result = digits.reduce((sum, int) => sum + int);
digits = (""+result).split("").map(Number);
}
return digits;
}
答案 2 :(得分:2)
问题是let关键字,因为 let 具有块级范围,在while循环开始时未定义“数字”
删除while循环中的数字
function digital_root(n) {
let digits = (""+n).split("").map(Number);
while (digits.length > 1) {
let result = digits.reduce((sum, int) => sum + int);
digits = (""+result).split("").map(Number);
}
return digits;
}
console.log(digital_root(47))