JavaScript 中的直接递归和相互递归

Direct and Mutual Recursion in JavaScript

我知道递归的基本概念,即调用自身的函数是递归。

现在我正在浏览有关相互递归的 NodeJS documentation, I found something called Direct Recursion and Mutual Recursion. I found a wikipedia 文档。但不确定它如何与 JavaScript 一起使用。我有以下关于递归的问题。

这是直接递归的例子吗?:

function abc(num,sum){
   if(num<=0) return sum;
   return abc(--num,sum);
}
  1. 每次调用都会产生一个新的作用域。变量提升对所有函数的作用都是一样的,不管它是否递归。每个调用都有自己的一组参数和局部变量,因为它们位于不同的堆栈帧中。但是,如果您传递对象并改变它们,那么效果将适用于指向该对象的所有绑定。

  2. 是的。直接递归更像是数学概念。相互递归是一种模糊的暗示,即从该函数调用的某处最终将再次调用该函数的实例,但可能存在漫长而复杂的路径,因此可能无法通过查看代码。

  3. 你的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 是它看起来不像递归但最终流可以回到原始函数的地方。有可能使它变得如此模糊,以至于编译器不知道它是递归,而显式自我调用通常很容易确定。

如果(相互)反推函数在尾部位置,则与直接或相互无关。