我一直在尝试函数式编程和一些在Codewar( JavaScript)等网站上设置的挑战。我遇到的一个挑战是找到输入整数n
的数字根(即n
的每个单独数字的总和)。我真的需要一些帮助来解决它,但使用函数式范例,因为我已经用OOP技术通过其他方法完成了这项任务。使用的代码如下:
const digitalRoot = n => {
let arr = n.toString().split('').map(x => parseInt(x, 10)), sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
};
我不确定为什么这在大多数情况下都不起作用。它返回如下内容,例如:
digitalRoot(15); //returns 15 instead of 6
digitalRoot(108); //returns 108 instead of 9
digitalRoot(20); //returns 20 instead of 2
但是,在某些情况下,它确实有效:
digitalRoot(16); //returns 7 as expected
digitalRoot(0); //returns 0 as expected
有没有人能给我解释一下这个问题是什么,以及我该如何去修复它?尽管使用了parseInt
,但我不确定它是否会继续被视为字符串。请告诉我转换为字符串和数组等是否是不好的做法,和/或错误的方法。提前感谢大家!
发布于 2018-08-21 03:25:15
你应该用reduce将数字相加,而不是使用map,特别是如果你打算使用“函数式”javascript:
const rootNum = n =>
n.toString().split('').reduce((all, current)=>parseInt(current) + all, 0);
console.log(rootNum(1));
console.log(rootNum(20));
console.log(rootNum(440));
console.log(rootNum(1012340));
console.log(rootNum(1021394812));
发布于 2018-08-21 03:24:20
函数解可以是递归方法。只要n
不是0,就使用remainder operator (%)获取最后一个数字,并通过除以10将其从数字中删除,然后对结果进行四舍五入。
const digitalRoot = n =>
n && n % 10 + digitalRoot(Math.floor(n / 10));
console.log(digitalRoot(15));
console.log(digitalRoot(108));
console.log(digitalRoot(20));
console.log(digitalRoot(16));
console.log(digitalRoot(0));
发布于 2018-08-21 04:09:19
如果有人感兴趣,我在Java section of Stack Overflow中遇到了一个数学公式,它将消除任何类型的循环或递归,或调用其他函数的需要。
生成的代码为:
const digitalRoot = n => 1 + (n - 1) % 9;
这依赖于数字的数学属性,正如here所讨论的那样。
https://stackoverflow.com/questions/51937137
复制相似问题