关于JavaScript,我可以看到两种不同的编写自引用函数的方式:
除法或合并式算法,例如阶乘或合并排序,其中值从大小不断减小的样本递归计算:
const factorialOf20 = (function factorial(n) {
return (n == 0) ? 1 : n * factorial(n - 1);
})(20);
通过自调用函数进行循环(当循环包含异步执行的代码(例如,网络请求)但循环迭代需要序列化时,我觉得这很有用)。
var result = '';
(function doLoop(i) {
if (i < 10) {
i++;
request('http://...', function(err, res, body) {
result += body;
doLoop(i);
});
};
})(0);
在JavaScript中,通过递归循环时,每个函数调用都会建立一个新的执行上下文,对我来说,与调用不同函数的情况没有什么不同。
仍然认为这是递归吗?
最佳答案
归根结底,这比起纯粹的技术问题,更多的是命名问题,因此是见解。但是,请考虑以下方面:
function A(num)
{
if (num < 3) B(num);
}
function B(num)
{
A(num - 1);
}
长期以来也被认为是递归;
A
和B
都不能直接调用它们自己,但是整个调用链中都存在递归。因此,A
和B
都是递归的,因为A
仍然导致A
以及B
都被调用。因此,您的示例与此类似,尽管
doLoop
不调用doLoop
,但确实会导致doLoop
被调用。有人反对调用此递归的地方是
doLoop
不会成为先前doLoop
的调用链的一部分,或者可能不是(可能无法写明是否立即调用doLoop
的版本)。尽管在考虑如何实现语言时(例如是否有调用堆栈或其他允许递归的机制),这种更具体的递归定义比使用语言更有用。关于javascript - 是否将任何自引用函数视为 'recursion'?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49108726/