Python学习笔记__2.4章 递归函数

# 这是学习廖雪峰老师python教程的学习笔记


在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

 

使用递归函数写一个阶乘函数:

def fact(n):

    if n==1:

        return 1

    return n * fact(n - 1)

计算过程:

===> fact(5)

===> 5 * fact(4)

===> 5 * (4 * fact(3))

===> 5 * (4 * (3 * fact(2)))

===> 5 * (4 * (3 * (2 * fact(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3 * 2))

===> 5 * (4 * 6)

===> 5 * 24

===> 120

 

例题

汉诺塔的移动可以用递归函数非常简单地实现。

 

请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如:

# -*- coding: utf-8 -*-

 

def move(n, a, b, c):

     if n==1:

        print('move',a,'-->',c) #圆盘个数为1时,从a移动到c即可完成,用来终止递归

    else:

        move(n-1,a,c,b)  #把除了a柱子最下的一个圆盘以外的其他圆盘,都移动到b柱子

        move(1,a,b,c)    #把a柱子最下的圆盘,移动到c柱子

        move(n-1,b,a,c)  #把b柱子上的n-1个盘子,全部移动到c柱子

 

解析:

n==1 时,print 的是 a的值 ——》 c的值

 

首先区分 位置 和 值的关系这个函数在不断的调换各 位置 对应的 值,理解a,b,c和其对应位置的关系

那么,当n=3时,以大写字母表示位置,小写字母表示 真正的值

move(3,a,b,c)此时【A】=【a】,【B】=【b】,【C】=【c】

然后:

 

move(2,a,c,b)  # 将b,c的值调换了,此时【A】=【a】,【B】=【c】,【C】=【b】

move(1,a,c,b)  # 又将 b,c的值调换回来了 a-》c,此时【A】=【a】,【B】=【b】,【C】=【c】

move(1,a,b,c) # 此时【A】=【a】,【B】=【c】,【C】=【b】。故 a—》b

move(1,b,a,c) # 此时【A】=【c】,【B】=【a】,【C】=【b】。故 c—》b

 

move(1,a,b,c) # 此时【A】=【a】,【B】=【b】,【C】=【c】。故 a—》c

 

move(2,b,a,c) #  此时【A】=【b】,【B】=【a】,【C】=【c】。故 c—》b

move(1,a,c,b) # 此时【A】=【b】,【B】=【c】,【C】=【a】。故 b—》a

move(1,a,b,c) # 此时【A】=【b】,【B】=【a】,【C】=【c】。故 b—》c

move(1,b,a,c) # 此时【A】=【a】,【B】=【b】,【C】=【b】。故 a—》c

猜你喜欢

转载自blog.51cto.com/12758568/2115626