JavaScript中的直接和相互递归

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

现在我正在经历NodeJS documentation,我找到了一种叫做Direct Recursion和Mutual Recursion的东西.我找到了关于相互递归的wikipedia文档.但不确定它如何与JavaScript一起使用.我有关于递归的以下问题.

>函数声明和变量提升如何与相互递归一起工作?
>直接递归是指术语递归吗?

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

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

最佳答案 >每次通话都会产生新的范围.无论是否递归,变量提升在所有函数上的工作方式都相同.每个调用都有自己的参数和局部变量集,因为它们位于不同的堆栈帧中.但是,如果传递对象并对其进行变异,则效果将针对指向该对象的所有绑定.

>是的.直接递归更像是数学概念.相互递归是模糊的建议,在某个地方,来自此函数的调用最终会再次调用此函数的实例,但可能存在一个漫长而复杂的路径,因此可能无法通过查看码.

>你的腹肌是直接递归.

以下示例检查正数字参数是否为奇数.

直接递归:

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);
} 

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

如果(相互)重复函数处于尾部位置,则无论是直接还是相互,都无关.

点赞