JavaScript 中的直接和相互递归

Lax*_*nge 6 javascript recursion ecmascript-5

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

现在我正在浏览 NodeJS文档,我发现了一种叫做Direct RecursionMutual Recursion 的东西。我找到了关于相互递归的维基百科文档。但不确定它如何与 JavaScript 一起使用。我有以下关于递归的问题。

  • 函数声明和变量提升如何与相互递归一起工作?

  • 直接递归是指术语递归吗?

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

function abc(num,sum){
   if(num<=0) return sum;
   return abc(--num,sum);
}
Run Code Online (Sandbox Code Playgroud)

Syl*_*ter 2

  1. 每次调用都会产生一个新的作用域。变量提升在所有函数上的工作方式都是相同的,无论它是否是递归的。每个调用都有自己的一组参数和局部变量,因为它们位于不同的堆栈帧中。但是,如果您传递对象并改变它们,那么效果将适用于指向该对象的所有绑定。

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

  3. 你的abs是直接递归。

以下是检查正数值参数是否为奇数的示例。

直接递归:

function isOddDirect(n) {
  if (n < 1)
    return false;
  if (n === 1)
    return true;
  return isOddDirect(n-2);
}
Run Code Online (Sandbox Code Playgroud)

相互递归:

function isOdd(num) {
  if (num === 1)
    return true;
  return !isEven(num-1);
}

function isEven(num) {
  if (num === 0)
    return true;
  return !isOdd(num-1);
} 
Run Code Online (Sandbox Code Playgroud)

一个函数可能在同一个函数定义中同时使用直接递归和间接递归,然后它会同时执行这两种操作。直接是它显式地调用自身,而间接是它看起来不像递归,但最终流程可以返回到原始函数。有可能使它变得如此模糊,以至于编译器不知道它是递归,而显式自调用通常很容易确定。

如果(互)递归函数处于尾部位置,则与它是直接函数还是互函数无关。