首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在(函数式) JavaScript中寻找数字根-返回非常奇怪的值

在(函数式) JavaScript中寻找数字根-返回非常奇怪的值
EN

Stack Overflow用户
提问于 2018-08-21 03:13:49
回答 3查看 316关注 0票数 2

我一直在尝试函数式编程和一些在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,但我不确定它是否会继续被视为字符串。请告诉我转换为字符串和数组等是否是不好的做法,和/或错误的方法。提前感谢大家!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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));

票数 2
EN

Stack Overflow用户

发布于 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));

票数 0
EN

Stack Overflow用户

发布于 2018-08-21 04:09:19

如果有人感兴趣,我在Java section of Stack Overflow中遇到了一个数学公式,它将消除任何类型的循环或递归,或调用其他函数的需要。

生成的代码为:

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

这依赖于数字的数学属性,正如here所讨论的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51937137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档