而循环在JavaScript中永远运行
我用JavaScript编写了一个函数,它检查1到9之间的所有三位数组合,并给出遵循此模式的组合数 √(x^2+y^2+z^2)=自然数(如24或34但不是2.54的整数) √ = 平方根,^2=2的幂 我的问题是,每当我运行函数时,计算机就会卡住,函数永远不会结束,所以它不会返回答案。 如果有人能告诉我它有什么问题,我将不胜感激 (我正在chrome浏览器控制台上运行我的程序)而循环在JavaScript中永远运行,javascript,Javascript,我用JavaScript编写了一个函数,它检查1到9之间的所有三位数组合,并给出遵循此模式的组合数 √(x^2+y^2+z^2)=自然数(如24或34但不是2.54的整数) √ = 平方根,^2=2的幂 我的问题是,每当我运行函数时,计算机就会卡住,函数永远不会结束,所以它不会返回答案。 如果有人能告诉我它有什么问题,我将不胜感激 (我正在chrome浏览器控制台上运行我的程序) 函数mmd(){ var-chk=假; var a=1; var b=1; var c=1; var d=1; va
函数mmd(){
var-chk=假;
var a=1;
var b=1;
var c=1;
var d=1;
var e=0;
while(chk!=真){
d=Math.sqrt(Math.pow(a,2)+Math.pow(b,2)+Math.pow(c,2));
如果(d==d.toFixed(0)){
e++;
}
否则{
如果((b==9)&&(a==9)&&(c==9)){chk=true;}
如果((a==9)和&(b==9)){c++;}
如果(b==9){b=1;a++;}
如果(c==9){c=1;b++;}
else如果(c<9){c++;}
}
}
返回e
}
这部分代码导致它永远不会结束:
if (d == d.toFixed(0)){} else {}
如果公式的结果是整数,则将1添加到e
,但由于else
的原因,不增加其他变量。它一直在做e++
。因此,您需要删除该else
我还随意删除了chk
变量,而是使用while(true)
,最后返回最终结果:
函数mmd(){
变量a=1,b=1,c=1,d,e=0;
while(true){
d=Math.sqrt(Math.pow(a,2)+Math.pow(b,2)+Math.pow(c,2));
if(d==parseInt(d,10)){
e++;
}
如果((b==9)&&(a==9)&&(c==9)){返回e;}
如果((a==9)和&(b==9)){c++;}
如果(b==9){b=1;a++;}
如果(c==9){c=1;b++;}
else{c++;}
}
}
警报(mmd())代码>一旦碰到e++
块,它就会卡住,并且不会增加a
、b
或c
function mmd()
{
var keepGoing = true;
var a = 1, b = 1, c = 1, d, e = 0;
while(keepGoing)
{
// calculate d
d = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2) + Math.pow(c, 2));
// check if it is a whole number
if(d == d.toFixed(0)) e++;
// if we're done then stop
if(a == 9 && b == 9 && c == 9){ keepGoing = false; }
// if c is less than 9 then increase it
else if(c < 9){ c++; }
// if c is 9 and b is less than 9 then set c back to 1 and increase b
else if(b < 9){ c = 1; b++; }
// if c is 9 and b is 9 then set both back to 1 and increase a
else if(a < 9){ c = b = 1; a++; }
}
return e;
}
函数mmd()
{
var keepGoing=true;
变量a=1,b=1,c=1,d,e=0;
同时(继续)
{
//计算d
d=Math.sqrt(Math.pow(a,2)+Math.pow(b,2)+Math.pow(c,2));
//检查它是否是一个整数
如果(d==d.toFixed(0))e++;
//如果我们完成了,那就停下来
如果(a==9&&b==9&&c==9){keepGoing=false;}
//如果c小于9,则增加它
否则(c<9){C++(});}
//如果c为9且b小于9,则将c设置回1并增加b
如果(b<9){c=1;b++;}
//如果c为9,b为9,则将两者都设置回1并增加a
如果(a<9){c=b=1;a++;}
}
返回e;
}
如果所有数字都等于9,您只需更改复选框
,但将b
和c
反复更改为1如果(d==d.toFixed(0))
,您就可以执行e++代码>没有其他内容。如果这个条件只满足一次,它将始终保持为真,并且您的循环将永远保持e++
(直到崩溃)。这不是离题了吗?我建议使用CodeReview stack exchange网站。@evolutionxbox如果坏了,那是因为堆栈溢出。如果不是,但需要质量检查、性能等,那么它是用于代码审查的。旁注:对于不运行的代码,没有理由使用可运行的代码段。(你应该包括你的代码,但这可能会让人混淆你隐藏了实际的代码,而代码片段不会产生结果。)投票赞成。然而,可能有比:d==d.toFixed(0)更优雅的测试吗?@Roberto谢谢你,我现在用parseInt
代替了它,这对我来说似乎更自然,但我没有任何理由认为它比toFixed()更好。
function mmd()
{
var keepGoing = true;
var a = 1, b = 1, c = 1, d, e = 0;
while(keepGoing)
{
// calculate d
d = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2) + Math.pow(c, 2));
// check if it is a whole number
if(d == d.toFixed(0)) e++;
// if we're done then stop
if(a == 9 && b == 9 && c == 9){ keepGoing = false; }
// if c is less than 9 then increase it
else if(c < 9){ c++; }
// if c is 9 and b is less than 9 then set c back to 1 and increase b
else if(b < 9){ c = 1; b++; }
// if c is 9 and b is 9 then set both back to 1 and increase a
else if(a < 9){ c = b = 1; a++; }
}
return e;
}