什么是递归
递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决。通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数。乍一看,递归算法并没有什么特别的地方,但是,利用递归我们能够写出极为简明的解决问题的方法,而且如果不用递归,这些问题将具有很大的编程难度。
计算数字列表的和
我们先从一个简单的问题开始我们的探究,这个问题不需要递归也可以解决。假如你想对一个数字列表进行求和(例如[1,3,5,7,9]),代码所示的是一个通过迭代函数(for 循环)求和的程序。这个函数用一个变化着的“累加器”变量(theSum)对列表里面所有的数进行累加求和,也就是从 0 开始,依次加上列表中的每个数。
def list_sum(num_list):
the_sum = 0
for i in num_list:
the_sum = the_sum + i
return the_sum
print(list_sum([1,3,5,7,9]))
现在,假设我们不能使用 while 循环或者 for 循环,那么你会如何对数字列表中的数进行求和呢?如果你是个数学家,那么你首先想到的也许是:按照定义,加法是一个有两个参数——两个数字——的函数。为了将数字列表的问题重新定义为对两个参数求和的问题,我们可以利用全括号的表达式来重新表示列表,就像这种形式:(1+(3+(5+(7+9))))。
我们注意到最内层的括号中是(7+9),这是不需要任何循环或者特殊的结构就能解决的。事实上,我们可以用以下一系列简化后的式子来计算最终的加和。那么我们怎样将这个思想转化为 Python 代码呢?首先让我们从 Python 列表的角度来重新叙述这个问题。由于数字列表的和是列表中的第一个元素(numList[0])和剩下所有的元素(numList(1:))之和的和,求和问题可以归纳成以下的式子:listSum(numList)=first(numList)+listSum(rest(numList))
在这个等式中,first 代表列表中的第一个元素,而 rest 代表的是列表中除了第一个元素以外
的其他所有元素。此式很容易在 Python 中用代码表示出来。
def list_sum(num_list):
if len(num_list) == 1:
return num_list[0]
else:
return num_list[0] + list_sum(num_list[1:])