-1. 什么是递归
- 递归函数即自调函数,在函数体内部直接或间接的调用自己
-2. 递归的理解
- 举例说明:阶乘计算
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
如何来验证函数是否正确,Paul Graham提到一种方法
①当n=0, 1的时候, 结果正确.
②假设函数对于n是正确的, 函数对n+1结果也正确.
如果这两点是成立的,我们知道这个函数对于所有可能的n都是正确的。
-3. 使用递归
当我们理解递归过后,就要开始使用了,关于如何使用,Paul Graham提到, 你只需要做两件事情:
①你必须要示范如何解决问题的一般情况, 通过将问题切分成有限小并更小的子问题.
②你必须要示范如何通过有限的步骤, 来解决最小的问题(基本用例).
如果这两件事完成了, 那问题就解决了. 因为递归每次都将问题变得更小, 而一个有限的问题终究会被解决的, 而最小的问题仅需几个有限的步骤就能解决.
一个 汉诺塔 例子:
我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:
如果a只有一个圆盘,可以直接移动到c;
如果a有N个圆盘,可以看出a有1个圆盘(底盘)+(N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。
def move(n, a, b, c):
if n == 1:
print a, '-->', c
return
move(n-1, a, c, b)
print a, '-->', c
move(n-1, b, a, c)
move(4, 'A', 'B', 'C')
在此例中,基本用例:当有1个圆盘在A上, 我们直接把圆盘移动到C上即可.