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

标签 javascript recursion ecmascript-5

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

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

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

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

这是直接递归的例子吗?

function abc(num,sum){
   if(num<=0) return sum;
   return abc(--num,sum);
}

最佳答案

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

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

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

关于javascript - JavaScript 中的直接递归和相互递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47807062/

相关文章:

php - 递归合并数组而不覆盖重复键的最佳方法

JavaScript:在数组的 .length 上使用 defineProperty 访问器?

javascript - 当我实例化一个新类时使用 .call

javascript - 带下拉菜单的 angularjs ui.router activestate

javascript - Angular 6 : TypeError: Unable to get property 'nativeElement' of undefined or null reference

javascript - 使用node.js递归无限循环

javascript - 递归返回 undefined 而不是 true

javascript - 在 Javascript 中解析 ISO 8601 日期

javascript - JqueryUI 1.11 选项卡在同一页面上直接链接到选项卡

javascript - ios9 Safari 错误计算总和