我修改了这个使用欧几里得算法的代码,以生成一系列提醒。
崩溃(冻结/不运行)。想法?
var ne=prompt("Enter the first number n");
var me=prompt("Enter the second number m");
var n=ne;
var m=me;
var x=Math.floor(n/m);
var y=[] ;
y.push(n-m*x);
var i=1;
console.log(y[0] +"="+n+"-"+m+"*"+x);
do {
n=m ;
m=y ;
x=Math.floor(n/m);
y[i]=n-m*x ;
console.log(y[i] +"="+n+"-"+m+"*"+x);
var k=y[i];
i=i+1;
} while (k!==0);
console.log(m+" is the greatest common divisor of "+ne +", "+ me);
y.toString();
答案 0 :(得分:0)
我还不确定如何解决这个问题,但我可以告诉你,你在do ... while块中有一个无限循环。浏览器控制台反复吐出NaN NaN,有效地冻结了你提到的浏览器窗口/标签。
如果使用任何alpha作为参数运行Math.floor(),您将获得NaN错误,因此严格的k!== 0比较将永远为真,因此无限循环。
如果您不完全确定结果/已经完成了单元测试,那么这可能会很危险。我试着评估这个块:n=m ;
m=y ;
x=Math.floor(n/m);
y[i]=n-m*x ;
console.log(y[i] +"="+n+"-"+m+"*"+x);
var k=y[i];
i=i+1;
一次,首先没有循环,看看你是否得到更多的NaN' s。尝试在x上登录控制台,查看它是否吐出NaN
x=Math.floor(n/m);
console.log(x, 'is x NaN?');
更新
m = y,do循环中的第二行求值为[0]。所以下一行,x等于无穷大。此外,
y.push(n-m*x)
(y的值)似乎总是评估为[0],因此在Math.floor(n / m)中你最终得到m always = 0.
控制台赢得了什么,让你远远看不到的结果是:
console.log(y[i] +"="+n+"-"+m+"*"+x); // "NaN=2-0,NaN*Infinity"
然后
var k=y[i]; // k is NaN