递归的目标是创建一个调用自身的函数。
你可能有相互递归——函数 A 调用函数 B,调用函数 A ......但这里肯定不需要,并且更适合当你知道你需要做两件不同的事情(每个函数一个)并且知道你需要以一种跨越式的方式来完成它们。
当您考虑循环时,递归发挥作用。
通常,当您使用循环执行操作时,您最终可能会在彼此内部有两个或三个循环。
递归不是担心管理循环,而是一种思考循环的单次迭代中发生的事情的方式,并且只编写执行该操作所需的代码。
一个非常简单的奇异递归示例可能是将数组的所有元素记录到控制台。
这不是一个实际示例——它是一个微不足道的示例,其中包含您制作实际示例所需的大部分内容。
var array = [ "one", "two", "three", "four" ];
function listNextItem (array, index) {
var item = array[index];
if (!item) { return; }
console.log(item);
listNextItem(array, index + 1);
}
listNextItem(array, 0);
我创建了一个非常简单的函数,它看起来像您最内层循环的内部。
它设置一个项目变量,基于array[index]
.
如果它不存在,我们就完成了,我们可以从函数中返回,所以我们不会试图永远继续下去(这在递归中非常重要)。
如果确实存在,我们会记录该项目的值。然后我们调用完全相同的函数,并将完全相同的数组传递给它,但我们传递给它的值是index + 1
.
这是否改变了任何人的生活,或者使循环过时了?
并不真地。
但这是获得递归的第一步。
下一步是return
从递归中获取一个。
function recursiveAddOne (current, max) {
if (current === max) { return current; }
return 1 + recursiveAddOne(current + 1, max);
}
var total = recursiveAddOne(0, 3); // === 3 + 1 + 1 + 1
total; // 6
通常在我的返回语句中,我会将答案发送回外部世界的变量。
我仍在这样做,但在这里我将 a 添加call
到同一个函数中,作为我返回的一部分。
那有什么作用?
好吧,在内部函数返回之前,外部函数不能返回值。
在 ITS 内部函数返回之前,内部函数无法返回值...
...它一直下降,直到满足我的终止条件。该条件将一个值返回到其外部函数。该外部函数将该附加值返回给它的外部函数... ...一直到最外部的函数将所有其他函数的值放在一起,然后将其返回给外部世界。
这就像给每个俄罗斯套娃(“头巾”)娃娃一件作品。
你从最大的开始,一直到最小的。
最小的一个先做它的工作,然后把它交还给下一个,它做它的工作并把它交还给…………一直回来,直到你再次到外面。