Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在(功能)JavaScript中查找数字根-返回非常奇怪的值_Javascript_Ecmascript 6_Functional Programming - Fatal编程技术网

在(功能)JavaScript中查找数字根-返回非常奇怪的值

在(功能)JavaScript中查找数字根-返回非常奇怪的值,javascript,ecmascript-6,functional-programming,Javascript,Ecmascript 6,Functional Programming,我一直在玩函数式编程和一些网站上设置的挑战,比如Codewars(JavaScript)。我面临的一个挑战是找到输入整数n的数字根(即n的每个数字的总和)。我真的很想得到一些帮助来修复它,但是通过使用函数范式,因为我已经用OOP技术通过其他方式完成了这项任务。使用的代码如下: const digitalRoot = n => { let arr = n.toString().split('').map(x => parseInt(x, 10)), sum = 0; for (

我一直在玩函数式编程和一些网站上设置的挑战,比如Codewars(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(16); //returns 7 as expected
digitalRoot(0); //returns 0 as expected

有谁能解释一下这个问题是什么,我该如何着手解决它?尽管使用了
parseInt
,但我不确定它是否继续被视为字符串。请让我知道转换为字符串和数组等是否是错误的做法和/或错误的方法。提前多谢

函数解决方案可以是递归方法。只要
n
不是0,就使用获取最后一位数字,然后除以10,将其从数字中删除,并将结果向下舍入

constdigitalroot=n=>
n&&n%10+数字根(数学层(n/10));
console.log(digitalRoot(15));
console.log(digitalRoot(108));
console.log(digitalRoot(20));
console.log(digitalRoot(16));

console.log(digitalRoot(0))您应该将数字与reduce一起添加,而不是使用map,尤其是当您打算使用“功能性”javascript时:

constrootnum=n=>
n、 toString().split(“”).reduce((全部,当前)=>parseInt(当前)+all,0);
console.log(rootNum(1));
console.log(rootNum(20));
log(rootNum(440));
log(rootNum(1012340));

log(rootNum(1021394812))如果有人感兴趣,我在中找到了一个数学公式,它可以消除任何循环或递归的需要,或者根本不需要调用其他函数

生成的代码是:

const digitalRoot = n => 1 + (n - 1) % 9;

这取决于前面讨论过的数字的数学性质。

您的所有示例都为我提供了正确的结果。无法重现。
for
循环不是真正的函数式编程。递归或
.reduce()
将更具功能性。这可能是网站上使用的测试环境的问题。我会很快把它扔进JSBin,看看它是否仍然这样做。你们都是对的。问题在于测试环境,因为在其他地方手动独立运行这些测试会返回正确的值。但是,如果您能展示如何使用递归和/或.reduce()实现这一点,我将对@Barmar非常感兴趣。谢谢问题是“我如何修复它?”和“这是一个糟糕的做法吗?”,这也是一个编码挑战。由于他的代码工作正常,而且他确实要求功能解决方案,我添加了一个。@Oridori SO不应该是免费的编码服务。你给他答案并没有帮助他学习。我不太懂三元运算符的用法?在这里与0的比较在哪里完成?谢谢您的帮助。@dhalbat-如果
n
为0,则计算结果为false,并返回
0
。我已经用短路代替了它,只要数字不是0,递归就会继续。编码挑战的重点是让他自己弄明白这一点。你仅仅为他做并不能帮助他学习。@Barmar对不起,你在规则中看到了什么?以身作则比在黑暗中学习更容易。
const digitalRoot = n => 1 + (n - 1) % 9;