递归:
def fact(n): if n==1: return 1 return n * fact(n - 1)
使用递归函数需要注意防止栈溢出。
解决递归调用栈溢出的方法是通过尾递归优化。尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。
上面的fact(n)
函数由于return n * fact(n - 1)
引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:
def fact(n): return fact_iter(n, 1) def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product)
实例:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 利用递归函数计算阶乘 # N! = 1 * 2 * 3 * ... * N def fact(n): if n == 1: return 1 return n * fact(n-1) print('fact(1) =', fact(1)) print('fact(5) =', fact(5)) print('fact(10) =', fact(10)) # 利用递归函数移动汉诺塔: def move(n, a, b, c): if n == 1: print('move', a, '-->', c) else: move(n-1, a, c, b) move(1, a, b, c) move(n-1, b, a, c) move(4, 'A', 'B', 'C')