5.1 什么是递归
5.1.1 递归的定义
1.在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。 若调用自身,称之为直接递归。
2.若过程或函数A调用过程或函数B,而B又调用A,称之为间接递归。
3.在算法设计中,任何间接递归算法都可以转换为直接递归算法来实现,所以主要讨论直接递归。 4.如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,称为尾递归。
5.1.2 何时使用递归
1. 定义是递归的
有许多数学公式、数列等的定义是递归的。例如,求n!和Fibonacci(斐波那契)数列等。
def Fib(n): #求Fibonacci数列的第n项
if n==1 or n==2:
return 1
else:
return Fib(n-1)+Fib(n-2)
2. 数据结构是递归的
有些数据结构是递归的。如单链表就是一种递归数据结构。
class LinkNode: #单链表结点类
def __init__(self,data=None): #构造函数
self.data=data #dat属性
self.next=None #next属性
3. 问题的求解方法是递归的
def Hanoi(n,X,Y,Z): #Hanoi递归算法
if n==1: #只有一个盘片的情况
print("将第%d个盘片从%c移动到%c" %(n,X,Z))
else: #有两个或多个盘片的情况
Hanoi(n-1,X,Z,Y)
print("将第%d个盘片从%c移动到%c" %(n,X,Z))
Hanoi(n-1,Y,X,Z)
5.1.3 递归模型
1. 一般地,一个递归模型是由递归出口和递归体两部分组成。
2. 递归出口确定递归到何时结束,即指出明确的递归结束条件。
3. 递归体确定递归求解时的递推关系。
递归出口的一般格式如下:
5.1.5 递归的执行过程
(1)执行开始时,首先为递归调用建立一个工作栈,其结构包括值参、局部变量和返回地址。 (2)每次执行递归调用之前,把递归函数的值参和局部变量的当前值以及调用后的返回地址进栈。
(3)每次递归调用结束后,将栈顶元素出栈,使相应的值参和局部变量恢复为调用前的值,然后转向返回地址指定的位置继续执行。
5.2 递归算法的设计