# 这是学习廖雪峰老师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
原文地址:http://blog.51cto.com/12758568/2115626