我知道递归的基本概念,即调用自身的函数是递归.
现在我正在经历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);
}
函数可以在同一个函数定义中使用直接和间接递归,然后它会同时执行这两个操作.直接总是它自己明确地调用自己,而间接是它看起来不像递归但最终流可以返回到原始函数.有可能使这个模糊不清,以至于编译器不会知道它是递归,而显式自调通常很容易确定.
如果(相互)重复函数处于尾部位置,则无论是直接还是相互,都无关.