为什么我在javascript中获得无限循环

时间:2017-04-13 22:14:49

标签: javascript

我正在尝试返回提供的整数的阶乘。这样做的时候,例如:

factorialize(num) {
    for (var i = 1;i <= num; i++){
        num*=i;
    }
        return num;
    }
factorialize(5);

我得到一个无限循环。虽然我明白这不应该给我正确的答案,因为我对它的理解会是这样的:

n! = 5 * 1 * 2 * 3 * 4 * 5 = 600

什么时候真的应该去:

n! = 1 * 2 * 3 * 4 * 5 = 120

但是,我仍然不明白为什么我会在这里得到无限循环?

9 个答案:

答案 0 :(得分:8)

假设num变量的值为2

  • 第一个周期:

    for (var i = 1; i <= 2; i++) { //true
       num *= i; //2 = 2 * 1 => 2
    }
    
  • 第二周期:

    for (var i = 2; i <= 2; i++) { //true
       num *= i; //2 = 2 * 2 => 4
    }
    
  • 第三周期:

    for (var i = 3; i <= 4; i++) { //true
       num *= i; //4 = 4 * 3 => 12
    }
    
  • 第四个周期:

    for (var i = 4; i <= 12; i++) { //true
       num *= i; //12 = 12 * 4 => 48
    }
    

num以指数方式增加,而i线性增加

i <= num条件将始终满足,这就是您获得无限循环的原因。

enter image description here

包含图表的片段:

var num = {
  x: [1, 2, 3, 4, 5],
  y: [2, 4, 12, 48, 240],
  type: 'scatter',
  name: 'num'
};
var i = {
  x: [1, 2, 3, 4, 5],
  y: [1, 2, 3, 4, 5],
  type: 'scatter',
  name: 'i'
};
var data = [num, i];
Plotly.newPlot('myDiv', data);
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<div id="myDiv" style="width: 480px; height: 400px;">

答案 1 :(得分:2)

你的循环正在追逐一个移动的目标。

i到达num时,它会结束,但你继续使num更大;实际上i 永远不会到达num

正如您所指出的,无论如何,您的算法都是错误的。

function factorialize(num) {
   var result = 1;
   for (var i = 2; i <= num; i++) {
      result *= i;
   }
   return result;
}

console.log(factorialize(0));  // 1
console.log(factorialize(1));  // 1
console.log(factorialize(2));  // 2
console.log(factorialize(3));  // 6
console.log(factorialize(4));  // 24
console.log(factorialize(5));  // 120

答案 2 :(得分:1)

在for循环中使用的变量,它与用于存储乘法的变量相同。

这应该有效:

factorialize(num) {
    var len = num;
    for (var i = 1;i <= len; i++){
        num*=i;
    }
        return num;
    }
factorialize(5);

答案 3 :(得分:0)

这是因为您正在动态更新num的值。因此,在每次迭代之后,数字变得越来越大,这就是为什么i的值永远不会超过num的值(对于大于1的num的值)

答案 4 :(得分:0)

因为您更改了&#39; num&#39;的值在每次迭代中。您应该使用第三个变量来计算产品。

答案 5 :(得分:0)

你得到一个无限循环因为你总是更新num。你在做num = num * i。所以它永远不会到达循环的结尾。 i永远不会超过num

答案 6 :(得分:0)

举个例子:

在跑步1之前: num = 5; 运行1后: num = 5; 运行2之后: num = 10; 运行3之后: num = 30;

根据你的条件,只有当num大于i时,循环才会停止,这种情况永远不会发生,因为你在每次迭代时修改它的值都会产生很大的差异。

答案 7 :(得分:0)

此处i永远不会抓住num

i = 1 num = 5  1 <= 5  //(num = 5*1)
i = 2 num = 5  2 <= 10 //(num = 5*2) 
i = 3 num = 10 3 <= 30 //(num = 10*3)
... 

答案 8 :(得分:0)

i<=num的结束条件总是true因此无限循环,因为参数num随着每次迭代而不断增加。 更好的方法是

function factorialize(num) {
  var res = 1;
  if(num ===0 || num === 1){
    return 1;
	}
   for (var i = 2;i <= num; i++){
      res*=i;
    }
      return res;
    }
factorialize(5);