递归算法
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
递归应用
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(例如:Fibonacci函数)
(2)问题解法按递归算法实现。
这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
(3)数据的结构形式是按递归定义的。
如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
设计递归算法的步骤:
1.确定递归公式
2.确定边界(终了)条件
递归的缺点
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
简单递归问题举例
- 斐波纳契数列(Fibonacci Sequence),又称黄金分割数列。
1、1、2、3、5、8、13、21…
Fib(0) = 1,Fib(1) = 1。
对所有n > 1的整数:
Fib(n) = (Fib(n-1) + Fib(n-2))
【斐波那契】
n = int(input())
def Fib(n):
if n == 0 or n == 1:
return 1
else:
return Fib(n-1)+Fib(n-2)
# 输出
for i in range (n):
print (Fib(i),end=' ')
- 阶乘
1!= 1
对所有n > 1的整数:
n! = (n * (n-1)!)
【阶乘】
n = int(input())
def Fact(n):
if n == 1:
return 1
else:
return n*Fact(n-1)
# 输出
print (Fact(n))
- 汉诺塔问题
已知有三根针分别用A, B, C表示,在A中从上到下依次放n个从小到大的盘子。
现要求把所有的盘子从A针全部移到C针,移动规则是:可以使用B临时存放盘子,每次只能移动一块盘子,而且每根针上不能出现大盘压小盘,找出移动次数最小的方案。
A,B,C三个盘子,分别为初始位,过渡位,目标位:
(1)将最上面的n-1个圆盘从初始位移动到过渡位
(2)将初始位的最底下的一个圆盘移动到目标位
(3)将过渡位的n-1个圆盘移动到目标位
【汉诺塔问题】
count = 0
def hanoi(n,start,end,mid):
global count
if n == 1: