Javascript `对于`调试无限循环的普通语法
我找到了这个函数。它接受整数数组并返回它们的最大公约数。有时它会进入一个无休止的循环,并使浏览器崩溃。我想调试它以找到原因,但我不理解fors中使用的语法。如何将这些重新写入普通forvar i;我试试看Javascript `对于`调试无限循环的普通语法,javascript,Javascript,我找到了这个函数。它接受整数数组并返回它们的最大公约数。有时它会进入一个无休止的循环,并使浏览器崩溃。我想调试它以找到原因,但我不理解fors中使用的语法。如何将这些重新写入普通forvar i;我试试看 var r, a, i = o.length - 1 var b = o[i]; while(i) { a = o[--i]; while(r = a % b) { a = b; b = r; } return b; } 我试试看 var r, a, i = o.l
var r, a, i = o.length - 1
var b = o[i];
while(i) {
a = o[--i];
while(r = a % b) {
a = b;
b = r;
}
return b;
}
我试试看
var r, a, i = o.length - 1
var b = o[i];
while(i) {
a = o[--i];
while(r = a % b) {
a = b;
b = r;
}
return b;
}
这个for做的事情与您以前看到的相同,但只是每个部分都有更多的步骤。报告分为三个部分: 第一部分:初始化变量 第2部分:验证for是否应继续迭代 第三部分:增加或减少变量 如果你看它,你会看到一些逗号;它用于声明多个变量或条件。下面的代码与您发布的代码相同,但在某种程度上您似乎很熟悉:
mdc = function(o){
if(!o.length)
return 0;
var r;
var a;
var i = o.length - 1;
for(var b = o[i]; i;) {
for(a = o[--i]; r = a % b;b = r) {
a = b;
}
return b;
}
};
您可以注意到第二个以;,这相当于一个命令行,这就是为什么其中只有a=b命令,而不是返回b 这个for做的事情与您以前看到的相同,但只是在每个部分都有更多的步骤。报告分为三个部分: 第一部分:初始化变量 第2部分:验证for是否应继续迭代 第三部分:增加或减少变量 如果你看它,你会看到一些逗号;它用于声明多个变量或条件。下面的代码与您发布的代码相同,但在某种程度上您似乎很熟悉:
mdc = function(o){
if(!o.length)
return 0;
var r;
var a;
var i = o.length - 1;
for(var b = o[i]; i;) {
for(a = o[--i]; r = a % b;b = r) {
a = b;
}
return b;
}
};
您可以注意到第二个以;,这相当于一个命令行,这就是为什么其中只有a=b命令,而不是返回b 这里是从for循环到while循环的直译:
mdc = function(o){
if(!o.length)
return 0;
var r;
var a;
var i = o.length - 1;
var b = o[i];
while (i) {
a = o[--i];
while (r = a % b) {
a = b;
b = r;
}
}
return b;
};
下面是一个翻译,它解压了一些愚蠢之处,并重命名了变量:
mdc = function(o){
if(!o.length)
return 0;
var cur_index = o.length - 1;
var b = o[cur_index];
while (cur_index) {
cur_index -= 1;
var a = o[cur_index];
var remainder = a % b;
while (remainder) {
a = b;
b = remainder;
remainder = a % b;
}
}
return b;
};
以下是从for循环到while循环的直译:
mdc = function(o){
if(!o.length)
return 0;
var r;
var a;
var i = o.length - 1;
var b = o[i];
while (i) {
a = o[--i];
while (r = a % b) {
a = b;
b = r;
}
}
return b;
};
下面是一个翻译,它解压了一些愚蠢之处,并重命名了变量:
mdc = function(o){
if(!o.length)
return 0;
var cur_index = o.length - 1;
var b = o[cur_index];
while (cur_index) {
cur_index -= 1;
var a = o[cur_index];
var remainder = a % b;
while (remainder) {
a = b;
b = remainder;
remainder = a % b;
}
}
return b;
};
for循环的基本公式是
for(initial code; condition to check for; code to execute after loop)
{
loop
}
我不喜欢那段代码中的语法。只需在顶部声明所有变量。因为您最感兴趣的是调试代码,所以每行最好有一条语句
mdc = function(o)
{
if(!o.length)
return 0;
var r, a, b, i;
i = o.length - 1;
b = o[i];
while(i)
{
a = o[i];
i--;
while(r = a % b)
{
a = b;
b = r;
}
}
return b;
};
for循环的基本公式是
for(initial code; condition to check for; code to execute after loop)
{
loop
}
我不喜欢那段代码中的语法。只需在顶部声明所有变量。因为您最感兴趣的是调试代码,所以每行最好有一条语句
mdc = function(o)
{
if(!o.length)
return 0;
var r, a, b, i;
i = o.length - 1;
b = o[i];
while(i)
{
a = o[i];
i--;
while(r = a % b)
{
a = b;
b = r;
}
}
return b;
};
``我认为问题是a,b需要互换,这取决于哪个更大。第二个是for循环。欧几里德算法就是这样做的。这个似乎没有那么做 数字数组的GCD:我将使用标准的欧几里德算法 如果从末尾开始迭代: GCD a,b=K 现在调用GCDK,数组中的下一个元素。这应该行得通
enter code here
Written in Pseudo-code What he is trying to do is more understandable:
For(b =array[end]; )
{
For(a= array[end-1]; end >=0 ;end --)
{
(i)Divide a/b
(ii)Put the new 'reduced' divisor in 'b'.
(iii)Put the reminder back in c
}
end --
}
}
}
那么,在循环结束时,什么都可以
他试图模拟的是一系列数字的gcd的手工除法计算——高中的把戏
正如我上面提到的,问题在于交换更大的a,b ``我认为问题在于a和b需要互换,这取决于哪个更大。第二个是for循环。欧几里德算法就是这样做的。这个似乎没有那么做 数字数组的GCD:我将使用标准的欧几里德算法 如果从末尾开始迭代: GCD a,b=K 现在调用GCDK,数组中的下一个元素。这应该行得通
enter code here
Written in Pseudo-code What he is trying to do is more understandable:
For(b =array[end]; )
{
For(a= array[end-1]; end >=0 ;end --)
{
(i)Divide a/b
(ii)Put the new 'reduced' divisor in 'b'.
(iii)Put the reminder back in c
}
end --
}
}
}
那么,在循环结束时,什么都可以
他试图模拟的是一系列数字的gcd的手工除法计算——高中的把戏
正如我上面提到的,问题在于交换更大的a,b 多么神秘。。代码太聪明了。把它分开:forinit;条件post..@pst,我会的,但问题是init、condition和post之间的边界不清楚,我无法进行正确的关联。边界是分号。逗号可以分解为init、condition和post的多语句版本。注意,外部循环的post是空的。多么神秘。。代码太聪明了。把它分开:forinit;条件post..@pst,我会的,但问题是init、condition和post之间的边界不清楚,我无法进行正确的关联。边界是分号。逗号可以分解为init、condition和post的多语句版本。请注意,外部环路的post是空的。