如何解决如何在递归函数中正确更新变量-基本示例
我正在努力加深对递归的理解,实际上,我已经完成了https://github.com/JS-Challenges/recursion-prompts/blob/master/src/recursion.js上的大多数基本递归问题。我似乎无法绕开的一件事是递归函数中的变量递增。这是一个称为GCD的递归提示的基本示例。
// 14.找到两个正数的最大公约数(gcd)。 GCD的两个 //整数是将x和y除以零的最大整数。 // gcd(4,36); // 4
var gcd = function(x,y){ };
这是我用javascript处理问题的代码
`var gcd = function(x,y) {
var counter = 1;
var currentGCD = 1;
if (x % counter === 0 && y % counter === 0) {
currentGCD = counter
counter++
} else {
counter++
}
if (counter > x || counter > y) return currentGCD
return gcd(x,y)
};
console.log(gcd(4,36)); // 4
console.log(gcd(12,36)); // 12
console.log(gcd(9,6)) // 3
`
当前代码将超出最大调用堆栈限制,因为计数器永远不会超过2。根据我的理解,我认为这是因为对于每个堆栈调用,变量都以其第一个分配的值“ counter = 1”重新定义,并且“ currentGCD = 1”。我知道可以在GCD中创建嵌套函数并以这种方式更新计数器,以便变量位于GCD范围内,但不在递归范围内,因此不会在每次调用时不断对其进行重新定义。但是我只是想念什么吗?还是那条路?
解决方法
如果您改变方向,请从可能的最大除数(较小的数)开始,如下所示:
function gcd(x,y,nextDivisior) {
const divisor = nextDivisior || Math.min(x,y);
if (divisor < 1) {
return Number.NaN;
}
if (x % divisor === 0 && y % divisor === 0) {
return divisor;
}
return gcd(x,divisor - 1);
}
console.log(gcd(4,32))
console.log(gcd(9,3))
console.log(gcd(7,11))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。