`用于调试无尽循环的“普通语法”
`for` ordinary syntax to debug endless loop
我在这里找到了函数。它接受一个整数数组,并返回它们的最大公约数。有时它会进入一个无休止的循环,导致浏览器崩溃。我想调试它以找到原因,但我不理解for
S中使用的语法。如何将这些语法重写为普通的for(var i; i<max; i++)
循环?
mdc = function(o){
if(!o.length)
return 0;
for(var r, a, i = o.length - 1, b = o[i]; i;)
for(a = o[--i]; r = a % b; a = b, b = r);
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;
};
我会试试
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"命令,而不是"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)需要互换,这取决于哪个更大。(第二个表示循环)。欧几里得算法可以做到这一点。这个似乎并没有这么做。
数字数组的GCD:我会使用标准的欧几里得算法。
如果从末尾开始迭代:GCD(a,b)=K
现在调用GCD(K,next_element_in_array)。这应该行得通。
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),后者更大。
相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- jQuery语法添加了var
- Javascript未捕获语法错误意外的标识符错误
- 为什么忽略了eval()代码中的语法错误
- 难以访问的JS环境中的语法错误
- 如何告诉MathJax对下标使用替代语法
- Javascript语法向设置发出sessionStorage值
- 未捕获的语法错误:意外的标记{
- 使用$scope方法时的ControllerAs语法
- "未捕获的语法错误:意外的标记}"
- javascript自执行函数-不同的语法
- 函数的Javascript语法
- WinJS内联绑定语法
- 使用JS函数来使用另一个函数的语法?node.js
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- 将普通js转换为角度语法的快速方法
- `用于调试无尽循环的“普通语法”
- 为什么不在对象外部使用属性定义语法是语法错误
- HTTPRequest语法的语法
- 除了语法之外,普通函数和箭头函数之间有什么区别吗