Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 Can';t在'中检测无限循环的原因;while循环';在JS中_Javascript_Loops_While Loop_Infinite Loop - Fatal编程技术网

Javascript Can';t在'中检测无限循环的原因;while循环';在JS中

Javascript Can';t在'中检测无限循环的原因;while循环';在JS中,javascript,loops,while-loop,infinite-loop,Javascript,Loops,While Loop,Infinite Loop,我的while循环中有一个无限循环,我找不到原因 它是一个简单的函数,返回参数的数字之和。我使用while循环,因为它需要将数字相加,直到到达一位数。 我确保添加了一条语句,确保循环在某一点中断,但显然没有 function digital_root(n) { num = n; sum = 0; while (num.toString().length>1){ for (i=0; i<num.toString().length; i++) {

我的while循环中有一个无限循环,我找不到原因

它是一个简单的函数,返回参数的数字之和。我使用while循环,因为它需要将数字相加,直到到达一位数。 我确保添加了一条语句,确保循环在某一点中断,但显然没有

function digital_root(n) {
 num = n;
 sum = 0;
 while (num.toString().length>1){
      for (i=0; i<num.toString().length; i++) {
           sum += parseInt(num.toString()[i])    
       }
       num = sum;
  }
  return sum;
}
digital_root(456)
函数数字根(n){
num=n;
总和=0;
while(num.toString().length>1){

对于(i=0;i您有一个嵌套循环结构,其中第一个条件始终为true

如果只得到10以下的数字,可以作为递归再次调用该函数

函数数字根(n){
var num=n.toString(),//声明并使用字符串值
总和=0,
我
对于(i=0;i9
?数字_根(总和)
:总数;
}

log(digital_root(456));
既然您已经得到了答案,下面是另一种满足结果的方法

函数数字根(n){
//将数字转换为字符串
//使用split创建一个数字数组,即['4'、'5'、'6']
//在转换为数字后,使用reduce对数字求和
//0是初始值
返回n.toString().split(“”).reduce((a,c)=>a+parseInt(c,10),0)
}

log(digital_root(456))
为了避免所有导致您所面临的情况的嵌套循环,我宁愿以更具可读性的方式进行

function digital_root(n) {
    sum = n;

    while(sum.toString().length > 1) {
        sum = sum.toString()
       .split('')
       .map(digit => parseInt(digit, 10))
       .reduce((acc, cur) => acc + cur);
    }

    return sum;
}

console.log(digital_root(456));

重新阅读问题后,我注意到您试图将整数减少为单个数字。代码的问题是,
sum
仅在while循环之前设置为
0
。这意味着它在第二次、第三次……运行时没有重置

sum=0
移动到while循环中可以解决这个问题。我还在顶部添加了变量声明,以避免设置全局变量

函数数字根(n){
var num,sum,i;
num=n;
while(num.toString().length>1){
总和=0;
对于(i=0;i控制台日志(数字根(456))
谢谢你的回答,brk,但正如我写Nina一样,这还没有解决我的问题。这里的挑战是,只要总和>9,我就需要不断地将总和的位数相加。或者换句话说,函数必须返回一个单位数整数。这就是我为什么首先使用while循环的原因。有什么想法吗?谢谢你的a回答,尼娜。但这还没有解决我的问题。这里的挑战是,只要求和>9,我就需要不断地将求和的位数相加。或者换句话说,函数必须返回一个单位数整数。这就是我首先使用while循环的原因。有什么想法吗?谢谢你的回答,aghashamim。但是你错过了一个导入问题的ant元素:函数必须返回一个一位数的整数。因此是循环。抱歉,我想我忽略了它,虽然您已经得到了答案,但我刚刚更新了答案中的代码,使其满足要求。非常感谢!我对您的第二个版本的代码有点着迷。我从未想过这是可能的在同一个函数中返回函数调用而不是while循环。哇!@elifbrikant谢谢。当我第一次读这个问题时,我没有注意到“我使用while循环,因为它需要将数字相加,直到它到达一个一位数。”,所以我提高了。只有在我重新阅读之后,我才注意到这不是你想要的答案。这个问题的表述非常好,但我猜具体的问题被太多的噪音所包围。我不太确定我会如何表述这个问题,也许会把要求放在一个列表中。在这里,人们经常跳过一半的内容。