递归的三定律
例:
def listsum(numList):
if len(numList) == 1:
return numList[0]
else:
return numList[0] + listsum(numList[1:])
print(listsum([1,3,5,7,9]))
所有递归算法必须服从三个重要的定律:
1. 递归算法必须具有基本情况。
2. 递归算法必须改变其状态并向基本情况靠近。
3. 递归算法必须以递归方式调用自身。
首先,基本情况是算法停止递归的条件。基本情况通常是足够小以直接求解的问题。在 listsum 算法中,基本情况是长度为 1 的列表。
为了遵守第二定律,我们必须将算法向基本情况的状态改变。状态的改变意味着该算法正在
使用的一些数据被修改。通常,表示问题的数据在某种程度上变小。在 listsum 算法中,我
们的主要数据结构是一个列表,因此我们必须将我们的状态转换工作集中在列表上。因为基
本情况是长度 1 的列表,所以朝向基本情况的自然进展是缩短列表。
最后的法则是算法必须调用自身。这是递归的定义。递归对于许多新手程序员来说是一个混
乱的概念。作为一个新手程序员,你已经知道函数是有益的,因为你可以将一个大问题分解
成较小的问题。较小的问题可以通过编写一个函数来解决。我们用一个函数解决问题,但该
函数通过调用自己解决问题!该逻辑不是循环;递归的逻辑是通过将问题分解成更小和更容易
的问题来解决的优雅表达。