(文章大部分内容摘抄自 结城浩–程序员的数学)
很推荐大家阅读此本书,作者对程序员涉及的数学知识的观点非常新颖,而且上面的知识对初学程序的大家非常好消化
课前对话:
GNU是什么的缩写?
是GNU is Not Unix的缩写.
那第一个单词GNU是什么的缩写呢?
…
没有个头啊
其实GNU就包含了全部
学习内容
通过汉诺塔谜题让大家对递归有一个初步印象
以阶乘,斐波那契数列,帕斯卡三角形为例,学习递归和递推公式
以递归形式描画递归图形的分形图
**
汉诺塔
**
题目:有A,B,C三根细柱,A柱套着6个圆盘,这些圆盘大小各异,按从大到小的顺序自下而上摆放
现在要把套在A柱上的6个圆盘全部移到B柱上.并且在移动圆盘时需要遵守下述规则:
- 一次只能移动柱子最上端的一个圆盘
- 小圆盘上不能放大圆盘小圆盘上不能放大圆盘
- 将1个圆盘从一根柱子移到另一根柱子,算移动1次,那么,将6个圆盘全部从A移到B最少需要移动几次呢?
- 将1个圆盘从一根柱子移到另一根柱子,算移动1次,那么,将6个圆盘全部从A移到B最少需要移动几次呢?
将1个圆盘从一根柱子移到另一根柱子,算移动1次,那么,将6个圆盘全部从A移到B最少需要移动几次呢?
解决措施:
让我们先从三个汉诺塔开始解决吧!
(大家可以先把图盖住,好好在头脑里思考下怎么移动)
从图中,我们发现:
思考题答案:
'6层汉诺塔’可以通过以下步骤求出:
- 首先,将5个圆盘从A柱移到C柱(解出5层汉诺塔)
- 然后,将6个之中最大的圆盘从A柱移到B柱
- 最后,将5个圆盘从C柱移到B柱(解出5层汉诺塔)
‘5层汉诺塔’,‘3层汉诺塔’…也是同样的解法,'1层汉诺塔’只要移动1次圆盘就OK啦
解出n层汉诺塔的步骤:
- 当n=0时,
不用做任何动作 - 当n>0时
首先,将n-1个圆盘从A柱,经由B柱中转,移到C柱(解出n-1)层汉诺塔
然后,将1个圆盘从A柱移到B柱
最后,将n-1盘从C柱,经由A柱中转,移到B柱(解出n-1层汉诺塔)
推出递推公式
求出解析式
解析式:使用n表示H(n)的式子
废话少说,放码过来(Python):
count=0
def hanoi(n,src,dst,mid): #src:A柱子 dst:B柱 mid:C柱
global count
if n==1: #当前柱子圆盘个数
print("{}:{}->{}".format(1,src,dst)) #当前柱子只剩下一个圆盘,直接移动
count+=1
else:
hanoi(n-1,src,mid,dst)
#n-1层的从A柱移动到B柱(中转站),从B柱移动到C柱
#n-1层的从C柱移动到A柱(中转站),从A柱移动到B柱
print("{}:{}->{}".format(n,src,dst)) #我们命名A柱上的圆盘的编号从上到下为1,2,3
count+=1
hanoi(n-1,mid,dst,src)
hanoi(6,'A','B','C')
print(count)
递归的思维方式
将复杂问题转换为较为简单的同类问题里是引用