根据随循环变化的数组变量终止do循环

时间:2017-03-03 00:57:38

标签: javascript

我修改了这个使用欧几里得算法的代码,以生成一系列提醒。

崩溃(冻结/不运行)。想法?

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();

1 个答案:

答案 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