Python学习笔记(七)—递归函数

时间:2021-09-28 02:27:36

-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上即可.