递归函数:在函数中调用自己
特点:
必须有一个明确的结束,return
举例1:
def fact(n):
"""求n的阶乘"""
if n == 1:
return 1
elif n > 1:
return n * fact(n-1)
缺点:函数的调用是栈实现的,调用一次栈便增加一层栈帧,返回函数则减去一层,栈不是无限的,
过多的调用会使栈溢出,尾递归函数可以解决这个问题,在调用函数是返回自身,并且在返回中不含表达式,
但是因为编译器没有考虑这个问题,所以即使使用尾递归优化,还是会出现栈溢出
def fact(n):
return fact_item(n,1)
def fact_item(num,faction):
if num == 1:
return 1
elif num > 1:
return fact_item(num-1,num*faction)
举例2:
def move(n,a,b,c):
"""汉诺塔的移动"""
if n == 1:
print(a + '-->' c)
return
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)
三根柱子,把程序分为三部分
1)把a柱上的前n-1个盘子先移动到b柱上
2)在把a柱上最后一个盘子放到c柱上
3)在把b柱上的盘子放到c上