JS 中的 GCD - 超出最大调用堆栈
GCD in JS - Maximum call stack exceeded
这是我为计算 GCD 而编写的递归代码:
function gcd(n1, n2) {
if(n1<n2) {
return gcd(n1, n2-n1);
}
else if(n2<n1) {
return gcd(n1-n2,n2);
}
else{
return n1;
}
}
console.log(gcd(process.argv[2], process.argv[3]));
它给我一个范围错误。知道为什么吗? :(
编辑:
我删除了 stdin 并用随机数替换它,它工作正常。
我想知道为什么它第一次不起作用...
始终知道或检查您尝试访问其索引的数组的大小。如果您遇到范围错误,则意味着数组不是您认为的大小,因此第 1 步是找出您的期望与现实不符的原因。
试试这个:
function gcd(n1, n2) {
if(n1<n2) {
return gcd(n1, n2-n1);
}
else if(n2<n1) {
return gcd(n1-n2,n2);
}
else{
return n1;
}
}
console.log(gcd(parseInt(process.argv[2]), parseInt(process.argv[3])));
我认为 JavaScript 的类型强制导致了一个问题。使用原始版本,我可以让它得到这样的调用堆栈溢出错误:
node gcd.js 3 11
这是我为计算 GCD 而编写的递归代码:
function gcd(n1, n2) {
if(n1<n2) {
return gcd(n1, n2-n1);
}
else if(n2<n1) {
return gcd(n1-n2,n2);
}
else{
return n1;
}
}
console.log(gcd(process.argv[2], process.argv[3]));
它给我一个范围错误。知道为什么吗? :(
编辑:
我删除了 stdin 并用随机数替换它,它工作正常。
我想知道为什么它第一次不起作用...
始终知道或检查您尝试访问其索引的数组的大小。如果您遇到范围错误,则意味着数组不是您认为的大小,因此第 1 步是找出您的期望与现实不符的原因。
试试这个:
function gcd(n1, n2) {
if(n1<n2) {
return gcd(n1, n2-n1);
}
else if(n2<n1) {
return gcd(n1-n2,n2);
}
else{
return n1;
}
}
console.log(gcd(parseInt(process.argv[2]), parseInt(process.argv[3])));
我认为 JavaScript 的类型强制导致了一个问题。使用原始版本,我可以让它得到这样的调用堆栈溢出错误:
node gcd.js 3 11