我正在尝试返回提供的整数的阶乘。这样做的时候,例如:
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
但是,我仍然不明白为什么我会在这里得到无限循环?
答案 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
条件将始终满足,这就是您获得无限循环的原因。
包含图表的片段:
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);