JS递归函数满足返回条件;不终止

时间:2021-03-29 23:40:31

标签: javascript recursion

为了在 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 并终止递归。这是为什么?

1 个答案:

答案 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 块范围之外。