为了在 JS 中练习递归函数,我正在尝试编写一个通过欧几里德方法找到 2 个整数的 GCD(最大公约数)的函数。
代码:
function euclidean(a,b){
if(!Number.isInteger(a)||!Number.isInteger(b)){alert("Both arguments must be integers!")}
else if(a<b){let temp=a; let a=b; let b=temp};
let rem=a%b;
console.log(rem);
if(rem==0){console.log("The GCD is "+b); return b}else{euclidean(b,rem);};
}
console.log(euclidean(270,192));
控制台输出为 78, 36, 6, 0, undefined ( screenshot link )
我得到未定义,然后添加了console.log。记录的数字似乎表明每个递归循环都按预期工作。变量 rem 似乎达到 0,似乎满足终止条件并且它的代码开始执行(控制台打印“The GCD is” + b)。但是,return 语句不会返回 b 并终止递归。这是为什么?
答案 0 :(得分:0)
如果你想要一个递归函数的返回值,你需要返回递归调用。
function euclidean(a,b){
if(!Number.isInteger(a)||!Number.isInteger(b)){
alert("Both arguments must be integers!")
}else if(a<b){
let temp=a; let a=b; let b=temp
};
let rem=a%b;
console.log(rem);
if(rem==0){
console.log("The GCD is "+b);
return b;
}else{
return euclidean(b,rem);
};
}
console.log(euclidean(270,192));
像这样。
补充说明;注意用 let 声明的变量的范围。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
let temp=a; let a=b; let b=temp
这些变量不会存在于它们的 else 块范围之外。