递归是一种通过迭代解决问题的方法。换句话说,递归函数是一个无限重复调用自身的函数(或直到某事停止它)。
关于递归函数的重要知识
每当你选择使用递归函数时,请记住这两个基本信息。
信息 1:递归不是 IIFE
递归函数不同于立即调用函数表达式(IIFE)。
IIFE 会自动调用一次自身。
但是,递归函数会在无限时间内自动重复调用自己,或者直到某些东西停止重新调用为止。
信息 2:递归函数需要一个基本情况
为停止递归函数的重新调用而编写的代码称为基本情况。
在创建递归函数时定义基本情况总是很重要的——这样函数就不会无休止地运行,从而使浏览器崩溃。
递归函数的例子
下面是一个JavaScript代码,它返回通过函数的递归调用返回的所有值的串联countDown()
。
// Create a recursive function:
function countDown(num) {
// Define the base case of this recursive function:
if (num < 0) {
return "Recursion Stopped!";
}
// Define the recursive case:
return num + ", " + countDown(num - 1);
}
// Invoke the countDown() recursive function:
countDown(2);
// The invocation above will return:
"2, 1, 0, Recursion Stopped!"
笔记
在上面的递归算法中,
countDown(num - 1)
代码使整个函数成为递归,因为是代码使countDown()
recall本身重复。
看看幕后的事件
当我们调用countDown
函数并传入值2
(即countDown(2)
)时,算法开始运行如下:
第 1 步:检查是否2
小于0
计算机检查了2
我们传递给函数num
参数的countDown
值是否小于0
。
由于2
不小于0
,计算机没有执行if
语句的代码。相反,它跳到if
语句之后的下一个代码——递归代码。
第二步:执行return语句
跳过if
语句后,计算机执行return num + " " + countDown(num - 1)
代码——但num
用参数的值(即2
)替换参数,如下所示:
return num + ", " + countDown(num - 1);
return 2 + ", " + countDown(2 - 1);
return 2 + ", " + countDown(1);
第 3 步:仅执行递归语句
在上面第 2 步的代码中,请注意该return
命令无法返回任何值,因为该return
语句包含countDown(1)
调用该countDown
函数的递归代码 ( ) 。
因此,在保留return
语句的其他部分(即2 + ", " +
)的同时,计算机将只执行递归代码(countDown(1)
)。
换句话说,countDown(1)
代码将countDown
在传入 value 时自动调用该函数1
。然后,算法将通过检查是否1
小于重新开始运行0
。
由于1
不小于0
,计算机跳到递归代码,如下所示:
return 2 + ", " + num + ", " + countDown(num - 1);
return 2 + ", " + 1 + ", " + countDown(1 - 1);
return 2 + ", " + 1 + ", " + countDown(0);
第 4 步:仅调用递归代码
再次注意,该return
命令(在第 3 步中)不能返回任何值,因为该return
语句包含countDown(0)
调用该countDown
函数的递归代码 ( ) 。
因此,在保留return
语句的其他部分(即2 + ", " + 1 + ", " +
)的同时,计算机将只执行递归代码(countDown(0)
)。因此,countDown(0)
代码将countDown
在传入 value 时自动调用该函数0
。
然后,该函数将通过检查是否0
小于重新开始运行0
。
由于0
不小于0
,计算机跳到递归代码,如下所示:
return 2 + ", " + 1 + ", " + num + ", " + countDown(num - 1);
return 2 + ", " + 1 + ", " + 0 + ", " + countDown(0 - 1);
return 2 + ", " + 1 + ", " + 0 + ", " + countDown(-1);
第五步:只执行递归代码
再说一次,该return
命令(在第 4 步中)不能返回任何值,因为该return
语句包含一个递归代码 ( countDown(-1)
) 来调用该countDown
函数。
因此,在保留return
语句的其他部分(即2 + ", " + 1 + ", " + 0 + ", " +
)的同时,计算机将只执行递归代码(countDown(-1)
)。因此,countDown(-1)
代码将countDown
在传入 value 时自动调用该函数-1
。
然后,该函数将通过检查是否-1
小于重新开始运行0
。
此时,-1
小于0
。因此,计算机将if
通过返回值来执行语句的代码,“Recursion Stopped!”
如下所示:
return 2 + ", " + 1 + ", " + 0 + ", " + "Recursion Stopped!";
最后,该return
语句现在具有可以有效连接和返回的值。因此,从的返回值countDown
将是:
"2, 1, 0, Recursion Stopped!"
总结
在本文中,我们了解到递归函数是一种重复调用自身直到某事停止调用的函数。
谢谢阅读!