我知道递归的基本概念,即调用自身的函数是递归。
现在我正在浏览 NodeJS documentation ,我发现了一个叫做Direct Recursion 和Mutual Recursion 的东西。我找到了一个 wikipedia有关相互递归的文档。但不确定它如何与 JavaScript 一起使用。我有以下关于递归的问题。
函数声明和变量提升如何与相互递归一起工作?
直接递归是指术语递归吗?
这是直接递归的例子吗?
function abc(num,sum){
if(num<=0) return sum;
return abc(--num,sum);
}
最佳答案
每次调用都会产生一个新的作用域。变量提升对所有函数的作用都是一样的,不管它是否递归。每个调用都有自己的一组参数和局部变量,因为它们位于不同的堆栈帧中。但是,如果您传递对象并改变它们,那么效果将适用于指向该对象的所有绑定(bind)。
是的。直接递归更像是数学概念。相互递归是一种模糊的暗示,即从该函数调用的某处最终将再次调用该函数的实例,但可能存在漫长而复杂的路径,因此可能无法通过查看代码。
您的
abs
是直接递归。
以下是检查正数参数是否为奇数的示例。
直接递归:
function isOddDirect(n) {
if (n < 1)
return false;
if (n === 1)
return true;
return isOddDirect(n-2);
}
相互递归:
function isOdd(num) {
if (num === 1)
return true;
return !isEven(num-1);
}
function isEven(num) {
if (num === 0)
return true;
return !isOdd(num-1);
}
一个函数可能在同一个函数定义中同时使用直接递归和间接递归,然后它会同时使用这两种递归。 Direct 总是显式地调用自己,而 indirect 是它看起来不像递归但最终流可以回到原始函数的地方。有可能使它变得如此模糊,以至于编译器不知道它是递归,而显式的 self 调用通常很容易确定。
如果(相互)反推函数在尾部位置,则与它是直接的还是相互的无关。
关于javascript - JavaScript 中的直接递归和相互递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47807062/