递归----自己定义自己 (一)

(文章大部分内容摘抄自 结城浩–程序员的数学)

很推荐大家阅读此本书,作者对程序员涉及的数学知识的观点非常新颖,而且上面的知识对初学程序的大家非常好消化

课前对话:

GNU是什么的缩写?
是GNU is Not Unix的缩写.
那第一个单词GNU是什么的缩写呢?

没有个头啊
其实GNU就包含了全部

学习内容

通过汉诺塔谜题让大家对递归有一个初步印象
以阶乘,斐波那契数列,帕斯卡三角形为例,学习递归和递推公式
以递归形式描画递归图形的分形图

**

汉诺塔

**
题目:有A,B,C三根细柱,A柱套着6个圆盘,这些圆盘大小各异,按从大到小的顺序自下而上摆放图1
现在要把套在A柱上的6个圆盘全部移到B柱上.并且在移动圆盘时需要遵守下述规则:

  1. 一次只能移动柱子最上端的一个圆盘
  2. 小圆盘上不能放大圆盘小圆盘上不能放大圆盘
  3. 将1个圆盘从一根柱子移到另一根柱子,算移动1次,那么,将6个圆盘全部从A移到B最少需要移动几次呢?
  4. 将1个圆盘从一根柱子移到另一根柱子,算移动1次,那么,将6个圆盘全部从A移到B最少需要移动几次呢?

将1个圆盘从一根柱子移到另一根柱子,算移动1次,那么,将6个圆盘全部从A移到B最少需要移动几次呢?

解决措施:

让我们先从三个汉诺塔开始解决吧!
(大家可以先把图盖住,好好在头脑里思考下怎么移动)
图2
从图中,我们发现:
图3

思考题答案:
'6层汉诺塔’可以通过以下步骤求出:

  1. 首先,将5个圆盘从A柱移到C柱(解出5层汉诺塔)
  2. 然后,将6个之中最大的圆盘从A柱移到B柱
  3. 最后,将5个圆盘从C柱移到B柱(解出5层汉诺塔)

在这里插入图片描述
‘5层汉诺塔’,‘3层汉诺塔’…也是同样的解法,'1层汉诺塔’只要移动1次圆盘就OK啦

解出n层汉诺塔的步骤:

  1. 当n=0时,
    不用做任何动作
  2. 当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)

递归的思维方式

将复杂问题转换为较为简单的同类问题里是引用

猜你喜欢

转载自blog.csdn.net/sinat_40701582/article/details/84754252
今日推荐