{F3[n] 为Hanoi塔中3根柱子,n个盘子的最少移动次数
Hanoi塔问题
Hanoi塔问题学号:姓名:1、问题及来源Hanoi塔又称汉诺塔、梵塔在十九世纪末,欧洲风行的一种游戏。
并大肆宣传说,布拉玛神庙的教士所玩的这种游戏结束之日就是世界毁灭之时。
该塔由三根固定金刚石插针和堆放在一根针上有小到大的64个金属盘片组成,目的是借助于中间,从左边移到右边。
规则是:一次移动一个盘;无论何时,小盘在上,大盘在下。
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
2、问题解决过程一、下面分析三层盘子的情况。
A BC A BCA 柱上的1,2两个,先搬到B 柱上(递归完成)再把A 柱上的3号搬到C 柱上最后把B 柱上的1,2两个搬到C 柱上(递归完成)。
二、 将三根针分别标记为A,B,C 针,要从含有n 个盘子的A 针上借助于B 针移动n个盘子到C 针,分为以下步骤:○1将A 针上的n-1个盘子借助于C 针移动到B 针;A BCA B CA BCA BC○2A针上剩下的最后一个最大的盘子直接移动到Ch;○3将B针上的n-1个盘子借助于A针移动到C针上;在上述步骤中,第1,3步骤使用到了递归的思想。
三、C++实现代码#include<iostream>using namespace std;#include<stdlib.h>void move(char ,char );void hanoi(int n, char a, char b, char c){if (n==1){move ( a , b);}else{hanoi( n-1 , a , b , c );move ( a, c );hanoi( n-1 , b , a , c );}}void move (char x, char y){cout<<x<<"--->"<<y<<endl;}void main(){hanoi(4, 'A', 'B', 'C');}四、输出结果(4层移动方法)1、分析与想法通过分析,最少的移动次数是2n-1,n为盘子的数目,最开始的提出问题的人所给的n值为64,即最少的移动次数是263次方,这是一个天文数字,不借助于高速计算机,人类是无法完成的。
汉诺塔次数计算公式
汉诺塔次数计算公式汉诺塔(Tower of Hanoi)是一个经典的数学谜题和智力游戏。
它由三根柱子和一些大小不同的圆盘组成,开始时,所有圆盘按照从大到小的顺序堆叠在一根柱子上,目标是将所有圆盘从起始柱子移动到另一根柱子,在移动过程中,大盘不能放在小盘上面。
要计算移动汉诺塔的最少次数,是有一个明确的计算公式的。
假设圆盘的数量为 n,那么完成移动所需的最少次数就是 2^n - 1 次。
比如说,如果只有一个圆盘,那么移动次数就是 2^1 - 1 = 1 次,这很简单,直接把这个圆盘从起始柱子移到目标柱子就行了。
要是有两个圆盘呢?那最少移动次数就是 2^2 - 1 = 3 次。
首先把小圆盘移到中间柱子,然后把大圆盘移到目标柱子,最后再把小圆盘移到目标柱子。
当圆盘数量增加时,移动次数会急剧增加。
我还记得有一次,我在课堂上给学生们讲解汉诺塔的次数计算问题。
我拿出了一套汉诺塔的教具,让同学们自己动手尝试移动。
一开始,大家都觉得挺简单,可当圆盘数量超过三个的时候,他们就开始手忙脚乱了。
有个叫小明的同学,特别积极,一直在尝试各种方法。
他一会儿把大盘放到小盘上面,一会儿又忘记了自己移动的步骤,急得抓耳挠腮。
我在旁边看着,也不着急提醒他,就想让他自己去摸索和思考。
过了好一会儿,小明终于发现了问题所在,他意识到不能随意乱移动,得按照一定的规律来。
于是,他开始认真思考,重新尝试。
其他同学也都全神贯注地摆弄着自己面前的汉诺塔,教室里充满了讨论和尝试的声音。
最后,经过大家的努力,终于都弄明白了汉诺塔的移动规律,也理解了次数计算公式的原理。
通过这个小小的汉诺塔游戏,同学们不仅锻炼了逻辑思维能力,还对数学产生了更浓厚的兴趣。
其实,汉诺塔的次数计算公式不仅仅是一个数学问题,它还反映了一种解决复杂问题的思路。
就像我们在生活中遇到的各种困难,看起来纷繁复杂,但只要我们找到规律,一步一个脚印,总能找到解决的办法。
在学习和探索的道路上,我们会遇到各种各样像汉诺塔这样的难题。
汉诺塔问题
汉诺塔问题山西省临汾市临汾三中学校高370班冀超指导老师:李艳芳摘要:通过对汉诺塔问题中盘子数与移动次数的关系,探寻其中的规律,并建立数学模型,达到用最小的开支,取得最大的效果。
关键词:汉诺塔问题数学模型如图,汉诺塔问题是指有三根杆子A,B,C。
C杆上有若干碟子,把所有碟子从C杆上移到B杆上,每次只能移动一个碟子,大的碟子不能叠在小的碟子上面。
求最少要移动多少次。
一. 发现并提出问题如上图,汉诺塔问题是指有三根杆子A,B,C。
C杆上有若干碟子,把所有碟子从C杆上移到B杆上,每次只能移动一个碟子,大的碟子不能叠在小的碟子上面。
现在C杆上有四个碟子求最少要移动多少次。
我问我周围的同学,发现有算出15步的、16步的、还有17步,还有20多步的。
当我一遍一遍地在脑子里模拟,在纸上画图,最后得出的结果是15.这就是这道题的最后答案我想,当时数出20多步的同学一定有一些步骤重复了。
最近要写论文,在课间做眼保健操时,我就很容易地想到了这个问题。
它能不能被深入地推广一下呢?于是我就开始了对这个论文题目的思考与研究。
二. 建立数学模型我列出了C杆上碟子的数量与移动次数的关系注意观察移动次数的增加量之间的关系:1+2=3 = (22-1-1)+22-13+4=7 = (23-1-1)+23-17+8=15 = (24-1-1)+24-115+16=31 = (25-1-1)+25-1由此猜想:当C杆上有n个碟子时,那么总移动次数为:(2n-1-1)+2n-1=2*2n-1-1=2n-1但这只是不完全归纳,如何从正面直接推导呢?三.数学模型的分析与问题的解决经过对刚才移动过程的回忆,我又发现,当C杆上有4个盘子时,可以先将最上边的3个碟子移动到A杆上,共七次;然后将第四个也就是最大的那个碟子移到B杆上,共一次;最后再将三个盘子移回B 杆,共七次。
一共是7+1+7=8次。
那么我们可以得到:当C杆上有n-1个碟子时,设总移动次数为a n-1次当C杆上有n个碟子时,设总移动次数为a n次那么a n=a n-1+1+a n-1a n=2a n-1+1a n+1=2(a n-1+1)即:数列{a n+1}是等比数列,首项是a1+1=2,公比是2∴:a n+1=2*2n-1可得到:a n=2n-1四.数学模型的进一步推广如下图,汉诺塔问题是指有三根杆子A,B,C。
汉诺塔问题递归算法
汉诺塔问题递归算法汉诺塔(TowerofHanoi)问题是一个已广为人知的智力游戏,在1883年由法国数学家douard Lucas发明。
它是一个受人瞩目的应用算法问题,它要求从一个给定的初始状态将一组盘子移动到另一个给定的终止状态。
在汉诺塔问题中,有三个塔,A,B,C,A塔上有n个盘子,从上到下,由大到小排列,要求移动到C塔上,每次只能移动一个盘子,并且大盘子不能放在小盘子上面。
有多种实现汉诺塔问题的算法,最常用的是递归算法,其基本思想是把问题拆分成若干小问题,逐步解决小问题,最终得到最终结果。
汉诺塔问题的递归算法实现步骤如下:1.果只有一个盘子,直接从A塔移动到C塔;2.果有 n 个盘子,先把A塔上的n - 1个盘子移动到B塔,再把A塔上的最后一个盘子移动到C塔,最后把B塔上的n - 1个盘子移动到C塔。
按照以上步骤,我们可以用一个具有终止条件的递归实现汉诺塔问题(源码如下):void TowerOfHanoi(int n, char fromrod, char torod, char auxrod){if (n == 1){printf(Move disk 1 from rod %c to rod %c fromrod, torod);return;}TowerOfHanoi(n-1, fromrod, auxrod, torod);printf(Move disk %d from rod %c to rod %c n, fromrod, torod);TowerOfHanoi(n-1, auxrod, torod, fromrod);}在程序中,我们首先计算n个盘子的最少移动次数,然后用一个循环实现递归,最后打印出每次移动最后一个盘子的原因以及目的地。
汉诺塔问题的递归算法广泛应用于计算机科学中,不仅可以解决上面描述的汉诺塔问题,而且可以用来解决许多其它的算法问题,如迷宫求解等。
它的优势是算法更加易读、方便理解、易于实现,尤其是当要求做复杂计算时,递归算法可以有助于把复杂的问题化简为简单的问题。
多柱汉诺塔问题浅析
多柱汉诺塔问题浅析汉诺塔问题汉诺塔(Tower of Hanoi)是一个数学游戏:有三根柱子,其中一根柱子自底向上串着尺寸渐小的多个圆盘,遵循以下规则:1、一次只能移动一个圆盘;2、大圆盘不能放在小圆盘上面。
请问最少需要移动多少步,才能将所有圆盘移到另一根柱子上?解答:设移动N NN个圆盘所需的最少步数为F(N) F(N)F(N)。
将三根柱子分别命名为A、B、C,要把N NN个圆盘从A柱移至C柱,拆解为如下步骤:1、将N−1 N-1N−1个圆盘从A柱移至B柱,需要F(N−1) F(N-1)F(N−1)步;2、将余下的最大圆盘从A柱移至C柱,需要一步;3、将N−1 N-1N−1个圆盘从B柱移至C柱,需要F(N−1) F(N-1)F(N−1)步。
得到最少移动步数的递推公式F(N)=2F(N−1)+1 F(N)=2F(N-1)+1F(N)=2F(N−1)+1。
易知F(1)=1 F(1)=1F(1)=1,可得通项公式F(N)=2N−1 F(N)=2^N-1F(N)=2N−1。
推广:如果有四根或者更多柱子,所需的最少移动步数又是多少?Frame-Stewart算法该算法采用递推的思想来求解多柱汉诺塔问题。
设M MM根柱子、N NN个圆盘所需的最少移动步数为FM(N) F_M(N)FM(N),将移动步骤拆解为:1、将r rr个圆盘移到另一根柱子上(非目标柱),需要FM(r) F_M(r)FM(r)步;2、将余下的N−r N-rN−r个圆盘移至目标柱,需要F M−1(N−r) F_{M-1}(N-r)FM−1(N−r)步;3、将r rr个圆盘移至目标柱,需要FM(r) F_M(r)FM(r)步。
得到递推公式FM(N)=min1≤r<N{2FM(r)+F M−1(N−r)}F_M(N)=\min\limits_{1\le r<N}\{2F_M(r)+F_{M-1}(N-r)\}FM (N)=1≤r<Nmin{2FM(r)+FM−1(N−r)}代码:#include <iostream>#include <math.h>#include <map>using namespace std;// the least number of movements for n disks, m pegsmap<pair<int, int>, double> mapLeastMoves;double LeastMoves(const int n, const int m) {if (n < 0 || m < 3)return -1;if (n == 1)return 1;const auto index = make_pair(n, m);if (mapLeastMoves.count(index) > 0)return mapLeastMoves[index];double least_moves;if (m == 3) {least_moves = pow(2., n) - 1;} else {least_moves = 2 * LeastMoves(n - 1, m) + LeastMoves(1, m - 1);for (int r = n - 2; r > 0; --r) {double moves = 2 * LeastMoves(r, m) + LeastMoves(n - r, m - 1);if (moves < least_moves)least_moves = moves;else // a little optimizationbreak;}}mapLeastMoves[index] = least_moves;return least_moves;}void main() {int M = 7, N = 10;cout << "M\\N";for (int n = 1; n <= N; ++n)cout << "\tN = " << n;cout << endl;for (int m = 3; m <= M; ++m) {cout << "M = " << m;for (int n = 1; n <= N; ++n)cout << "\t" << LeastMoves(n, m);cout << endl;}system("pause");}输出:M\N N = 1 N = 2 N = 3 N = 4 N = 5 N = 6 N = 7 N = 8 N = 9 N = 10M = 3 1 3 7 15 31 63 127 255 511 1023M = 4 1 3 5 9 13 17 25 33 41 49M = 5 1 3 5 7 11 15 19 23 2731M = 6 1 3 5 7 9 13 17 21 25 29M = 7 1 3 5 7 9 11 15 19 23 27多柱情形下的通项公式将F M−1(N−r) F_{M-1}(N-r)FM−1(N−r)继续展开,FM(N)F_M(N)FM(N)的推导公式可以改写成如下形式FM(N)=minrM,r M−1,…,r3{2[FM(rM)+F M−1(r M−1)+⋯+F3(r3 )]+1},s.t.{0≤r m<N,∀m∈[3,M]∑Mm=3rm+1=NF_M(N)=\min\limits_{r_M,r_{M-1},\dots,r_3}\{2[F_M(r_M)+F_{M-1}(r_{M-1})+\dots+F_3(r_3)]+1\},\\s.t.\quad\begin{cases}0\ler_m<N,\forallm\in[3,M]\\\sum_{m=3}^M{r_m}+1=N\end{cases}FM(N)=rM,rM−1,…,r3min{2[FM(rM)+FM−1(rM−1)+⋯+F3(r3)]+1},s.t.{0≤rm<N,∀m∈[3,M]∑m=3M rm+1=N用Δ \DeltaΔ表示N NN加一时FM(N) F_M(N)FM(N)的增量,设ΔF M(N)=FM(N)−F M(N−1) \Delta F_M(N)=F_M(N)-F_M(N-1)ΔFM(N)=FM(N)−FM(N−1),易得⎧⎧⎧⎧⎧⎧⎧⎧⎧ΔF M(1)=1ΔF M(N+1)=2min m∈[3,M]{ΔFm(rm+1)}ΔF M(N+1)≥ΔF M(N) \begin{cases}\DeltaF_M(1)=1\\\Delta F_M(N+1)=2\min\limits_{m\in[3,M]}\{\DeltaF_m(r_m+1)\}\\\Delta F_M(N+1)\ge\Delta F_M(N)\end{cases}⎧⎧⎧⎧⎧⎧⎧ΔFM(1)=1ΔFM(N+1)=2m∈[3,M]min{ΔFm(rm+1)}ΔFM(N+1)≥ΔFM(N)若rm+1=1,∃m∈[3,M] r_m+1=1,\exists m\in[3,M]rm+1=1,∃m∈[3,M],则ΔF M(N+1)=2ΔF m(1)=2 \DeltaF_M(N+1)=2\Delta F_m(1)=2ΔFM(N+1)=2ΔFm(1)=2。
hanoi塔递归算法
hanoi塔递归算法Hanoi塔问题是一道经典的递归问题,它源于印度传说中的一个古老故事。
这个故事讲述了一个寺庙里有三根柱子,其中一根柱子上有64个盘子,从小到大依次放置。
寺庙里的僧人们每天都要把这些盘子从一根柱子移动到另一根柱子上,并且规定在移动过程中不能把大盘子放在小盘子的上面。
这个问题的挑战在于如何用最少次数将所有盘子从起始柱移动到目标柱。
1. 问题描述假设有三根柱子,分别为A、B、C,其中A柱上有n个圆盘,大小依次递增。
现在需要将A柱上的所有圆盘移动到C柱上,可以借助B柱作为中转站,但是需要满足以下条件:1. 每次只能移动一个圆盘;2. 圆盘可以放置在空柱或者比它大的圆盘上;3. 需要保证始终满足第2条规则。
求解该问题所需最少步骤。
2. 递归算法实现Hanoi塔问题可以使用递归算法来进行求解。
递归算法的基本思路是将一个大问题分解成若干个小问题,通过不断递归调用函数来解决这些小问题。
对于Hanoi塔问题,我们可以将其分解成三个步骤:1. 将n-1个圆盘从A柱移动到B柱;2. 将第n个圆盘从A柱移动到C柱;3. 将n-1个圆盘从B柱移动到C柱。
这样一来,原问题就被分解成了三个规模更小的子问题。
对于每一个子问题,我们可以继续按照同样的方式进行分解,直到规模变得足够小,可以直接求解为止。
下面是Hanoi塔递归算法的实现代码:```void hanoi(int n, char A, char B, char C) {if (n == 1) {cout << "Move disk " << n << " from " << A << " to " << C << endl;} else {hanoi(n - 1, A, C, B);cout << "Move disk " << n << " from " << A << " to " << C << endl;hanoi(n - 1, B, A, C);}}```其中,参数n表示当前需要移动的圆盘数量;参数A、B、C表示三根柱子的名称。
汉诺塔递归算法
汉诺塔递归算法
1. 简介
汉诺塔(Hanoi Tower)是一种经典的数学问题,它由法国数学家Edouard Lucas于1883年引入,并以法国一个寺庙的名字命名。
汉诺塔问题是一个经典的递归问题,它可以通过递归算法来解决。
2. 问题描述
汉诺塔问题的问法如下:
有三根柱子A、B、C,初始时柱子A上有若干个大小不同的盘子,按照从小到大的顺序从上往下叠放。
现在需要将这些盘子从柱子A移动到柱子C,移动过程中需要满足以下条件:
1.每次只能移动一个盘子;
2.每根柱子上的盘子都必须保持原有的从小到大的顺序。
问:如何才能将这些盘子从柱子A移动到柱子C,并且满足以上条件?
3. 解决方法
汉诺塔问题的解决方法之一是使用递归算法。
递归算法是一种通过函数自身调用来解决问题的方法。
对于汉诺塔问题,可以通过以下的递归算法来解决:
步骤
1.如果只有一个盘子需要移动,直接将盘子从柱子A移动到柱子C即可;
2.如果有多个盘子需要移动,将其分成三个步骤:
1.将n-1个盘子从柱子A移动到柱子B;
2.将最大的盘子从柱子A移动到柱子C;
3.将n-1个盘子从柱子B移动到柱子C。
递归实现
以下是使用递归实现汉诺塔问题的Python代码:
```python def hanoi(n, A, B, C): if n == 1: print(f。
python经典设计题移动盘子
Python经典设计题移动盘子1. 概述移动盘子是Python经典题目中的一道经典题目,通过这个题目可以很好地理解递归的思想和实现。
本文将通过分析问题、设计算法以及实现代码的方式,深入探讨移动盘子这个经典设计题目。
2. 问题分析移动盘子的问题描述为:有3根柱子,第一根柱子上有n个盘子,盘子的大小各不相同,大的在下,小的在上。
要求将这些盘子从第一根柱子移动到第三根柱子,并且移动过程中遵循以下规则:- 每次只能移动一个盘子- 盘子只能放在没有盘子或者比自己大的盘子上3. 算法设计为了解决移动盘子的问题,我们需要设计一个递归的算法来实现盘子的移动过程。
具体来说,我们可以按照以下步骤来设计算法:- 如果只有一个盘子,直接将其从起始柱子移动到目标柱子- 如果有多个盘子,可以将这个问题分解成三个子问题:- 将n-1个盘子从起始柱子移动到辅助柱子- 将最后一个盘子从起始柱子移动到目标柱子- 将n-1个盘子从辅助柱子移动到目标柱子通过递归调用这个过程,可以实现整个盘子的移动过程。
4. 代码实现接下来,我们用Python来实现上述设计的算法。
我们定义一个函数来表示移动盘子的过程:```pythondef moveTower(height, fromPole, toPole, withPole):if height >= 1:moveTower(height-1, fromPole, withPole, toPole)moveDisk(fromPole, toPole)moveTower(height-1, withPole, toPole, fromPole)def moveDisk(fp, tp):print("Moving disk from", fp, "to", tp)```在实现中,我们用`moveTower`函数来表示整个移动过程,其中`height`表示盘子的高度,`fromPole`表示起始柱子,`toPole`表示目标柱子,`withPole`表示辅助柱子。
5道经典智力测试题答案
5道经典智力测试题答案1. 河内塔问题(Hanoi Tower Problem)河内塔问题是一个经典的递归问题,需要将三个不同大小的圆盘从一根柱子移动到另一根柱子,每次只能移动一个圆盘,并且不能将一个较大的圆盘放在较小的圆盘上。
解决这个问题的关键是使用递归方法,首先将上面的n-1个圆盘移动到辅助柱子上,然后将最大的圆盘移动到目标柱子上,最后将辅助柱子上的n-1个圆盘移动到目标柱子上。
对于n个圆盘,最少需要2^n - 1步。
2. 逻辑推理题:谁是凶手?假设有五个人,A、B、C、D、E,他们中的一个是凶手。
根据线索:A说:“我不是凶手。
” B说:“C是凶手。
” C说:“D是凶手。
” D说:“我不是凶手。
” E说:“B是凶手。
” 只有一个人说真话。
通过逻辑推理,我们可以确定只有D的话是真话,因为如果A或D之外的人说真话,就会有多于一个人说真话。
所以,C是凶手。
3. 密码锁问题假设有一个密码锁,需要输入一个四位数字密码才能打开。
密码的每一位都是0-9之间的数字,且不重复。
如果我们知道密码的第一位是1,第二位是偶数,第三位比第四位大,且第四位是奇数,我们可以通过排除法来确定密码。
根据这些条件,我们可以列出所有可能的组合,然后逐一排除,最终找到正确的密码。
4. 渡河问题有一家人要过河,包括父亲、母亲、两个儿子、两个女儿、一个仆人以及一只狗。
只有父亲、母亲和仆人能划船,每次只能载两个人(或一个人和狗)。
如果父亲离开,母亲会打儿子;如果母亲离开,父亲会打女儿;如果仆人离开,狗会咬其他人。
如何安全地让所有人都过河?答案是通过一系列步骤,确保每次船上的人或狗不会对留下的其他人构成威胁。
5. 猜数字游戏猜数字游戏是一个简单的逻辑游戏,其中一个人想一个1到100之间的数字,另一个人通过提问来猜测这个数字。
提问者每次只能问一个问题,比如“这个数字是50吗?”或者“这个数字比50大吗?”,然后根据回答逐步缩小范围,直到猜中数字。
hanoi塔递归算法c语言
hanoi塔递归算法c语言Hanoi塔递归算法C语言Hanoi塔问题是一个经典的递归问题,它是由法国数学家Edouard Lucas在1883年发明的。
问题的描述是:有三根柱子,其中一根柱子上有n个大小不同的盘子,盘子从小到大依次放在柱子上,现在需要将这些盘子从起始柱子移动到目标柱子,移动过程中需要遵守以下规则:1. 每次只能移动一个盘子;2. 盘子只能放在比它大的盘子上面;3. 每根柱子上的盘子只能按照从小到大的顺序排列。
这个问题看起来很简单,但是如果没有思路,很难想到如何解决。
递归算法是解决这个问题的最佳方法之一。
递归算法的思路是:将n个盘子从起始柱子移动到目标柱子,可以分解为以下三个步骤:1. 将n-1个盘子从起始柱子移动到辅助柱子;2. 将第n个盘子从起始柱子移动到目标柱子;3. 将n-1个盘子从辅助柱子移动到目标柱子。
这个思路可以用递归函数来实现。
下面是一个用C语言实现的Hanoi塔递归算法:```#include <stdio.h>void hanoi(int n, char from, char to, char aux) {if (n == 1) {printf("Move disk 1 from %c to %c\n", from, to);return;}hanoi(n-1, from, aux, to);printf("Move disk %d from %c to %c\n", n, from, to);hanoi(n-1, aux, to, from);}int main() {int n = 3;hanoi(n, 'A', 'C', 'B');return 0;}```在这个程序中,hanoi函数接受三个参数:n表示盘子的数量,from表示起始柱子,to表示目标柱子,aux表示辅助柱子。
汉诺塔最少步数公式
汉诺塔最少步数公式汉诺塔是一种经典的数学游戏,它的目标是将三个柱子上按照大小顺序排列的盘子,从起始柱子移动到目标柱子上。
为了达成这个目标,我们可以使用递归的方式来解决。
最少步数公式当我们需要将 n 个盘子从柱子 A 移动到柱子 C 时,最少需要多少步呢?经过数学推导可知,我们可以使用一个简单的公式来计算出最少步数:F(n) = 2F(n-1) + 1其中,n 表示盘子的数量,F(n) 表示将 n 个盘子从柱子 A 移动到柱子C 所需的最少步数。
公式意义为:将 n 个盘子从柱子 A 移动到柱子 C所需的最少步数等于先将 n-1 个盘子从柱子 A 移动到柱子 B,再将剩余的 1 个盘子从柱子 A 移动到柱子 C,最后将 n-1 个盘子从柱子 B 移动到柱子 C 所需的步数再加上 1。
举个例子,当盘子数量为 3 时,根据公式可知:F(3) = 2F(2) + 1 = 2(2F(1) + 1) + 1 = 2(2*1+1) + 1 = 7即将 3 个盘子从柱子 A 移动到柱子 C 最少需要 7 步。
递归算法通过递归算法,我们可以将盘子的移动过程拆分成多个小的子问题,每次处理一个子问题,直到最终解决所有问题。
具体的过程如下:1. 将前 n-1 个盘子从柱子 A 移动到柱子 B2. 将第 n 个盘子从柱子 A 移动到柱子 C3. 将前 n-1 个盘子从柱子 B 移动到柱子 C在每一次递归中,我们需要将当前问题拆分成三个子问题,并逐步解决这些子问题。
当盘子数量越来越少时,递归的规模也逐渐缩小,最终问题得到解决。
时间复杂度汉诺塔问题的时间复杂度为 O(2^n),其中 n 表示盘子数量。
这是由于在每一次递归中,我们需要处理两个子问题,因此总共需要递归 2^n-1 次。
虽然时间复杂度比较高,但在实际运用中,汉诺塔算法的问题规模往往比较小,因此并不会产生太大的性能问题。
总结汉诺塔问题是一种经典的递归算法,它的解法可以简单地用一个公式表示,并通过分治的方式实现。
汉诺塔n层移动规律
汉诺塔n层移动规律汉诺塔,又称为汉诺威塔,是一种数学游戏和智力挑战。
它由三个柱子组成,初始时,在第一个柱子上按照从大到小的顺序叠放着n 个大小不等的圆盘。
游戏的目标是将所有的圆盘从第一个柱子移动到第三个柱子,但是在移动的过程中,必须遵守以下规则:1. 每次只能移动一个圆盘;2. 每次移动,必须将圆盘从一个柱子的顶端移到另一个柱子的顶端;3. 任何时候,大的圆盘都不能放在小的圆盘上面。
汉诺塔问题的解法有很多,但是最经典的解法是使用递归的方法。
下面以一个具体的例子来说明:假设有三个柱子,分别为A、B、C,初始时所有的圆盘都叠放在柱子A上。
我们的目标是将所有的圆盘从柱子A移动到柱子C。
首先,我们需要将上面n-1个圆盘从柱子A移动到柱子B,然后将最大的圆盘从柱子A移动到柱子C,最后将n-1个圆盘从柱子B移动到柱子C。
这个过程可以看作是一个递归的过程。
具体的步骤如下:1. 将n-1个圆盘从柱子A移动到柱子B:这个步骤可以看作是一个新的汉诺塔问题,只不过规模变小了。
按照相同的规则,我们可以将n-1个圆盘从柱子A移动到柱子B。
这一步的具体步骤可以通过递归来实现。
2. 将最大的圆盘从柱子A移动到柱子C:这个步骤很简单,只需要将最大的圆盘从柱子A移动到柱子C即可。
3. 将n-1个圆盘从柱子B移动到柱子C:这个步骤同样可以看作是一个新的汉诺塔问题,规模为n-1。
按照相同的规则,我们可以将n-1个圆盘从柱子B移动到柱子C。
这一步的具体步骤同样可以通过递归来实现。
通过以上三个步骤,我们就可以将n个圆盘从柱子A移动到柱子C 了。
整个过程类似于将一个大问题分解成了三个小问题,然后逐个解决小问题。
总结一下,汉诺塔问题是一个经典的数学问题,通过递归的方法可以很好地解决。
在解决问题的过程中,需要遵守规则,并且将大问题分解成小问题来解决。
这个问题的解法不仅能够锻炼我们的思维能力,还能够帮助我们理解递归的概念。
无论是在数学领域还是在其他领域,递归都是一种非常重要的思维方式,它能够帮助我们解决更加复杂的问题。
移动小棒的思维题
移动小棒的思维题引言移动小棒的思维题是一类常见的逻辑推理题目,通过改变小棒的位置来实现特定要求。
这类题目不仅可以锻炼我们的逻辑思维能力,还能培养我们的耐心和坚持不懈的精神。
在本文中,我们将探讨几种常见的移动小棒的思维题,并提供解决这些问题的方法。
二级标题1:水平移动的棒子三级标题1:问题描述在水平直线上有一排长度相等的小棒,每根小棒都能水平移动。
现在需要改变小棒的位置,使得小棒的顺序倒过来,即从右到左分别为1、2、3、…、n,其中n为小棒的数量。
三级标题2:解题思路1.我们可以通过两两交换相邻的小棒来实现目标。
首先,将最左边的小棒移到最右边,然后将倒数第二个小棒移到倒数第一个位置,以此类推。
2.为了能够轻松地进行交换,我们可以使用一个额外的变量来暂存小棒的值。
三级标题3:步骤演示1.初始状态:1 2 3 4 5 6 7 8 92.将最左边的小棒移到最右边:2 3 4 5 6 7 8 9 13.将倒数第二个小棒移到倒数第一个位置:2 3 4 5 6 7 8 1 94.以此类推,直到最终目标达成。
三级标题4:代码实现def reverse_order_sticks(sticks):n = len(sticks)for i in range(n // 2):temp = sticks[i]sticks[i] = sticks[n - i - 1]sticks[n - i - 1] = tempreturn sticks二级标题2:垂直移动的棒子三级标题1:问题描述在垂直直线上有一排长度不等的小棒,每根小棒都能垂直移动。
现在需要将小棒按照长度从短到长的顺序排列。
三级标题2:解题思路1.首先,我们可以通过选择排序的方法来实现目标。
选择排序的基本思想是每次从剩余的小棒中选择最短的小棒并放到正确的位置。
2.我们可以使用两个指针,一个指向当前需要放置的位置,另一个指向选择的最短小棒的位置。
三级标题3:步骤演示1.初始状态:5 3 7 2 8 1 6 42.第一轮排序:1 3 7 2 8 5 6 43.第二轮排序:1 2 7 3 8 5 6 44.第三轮排序:1 2 3 7 8 5 6 45.以此类推,直到最终目标达成。
汉诺塔递归算法及详解
汉诺塔递归算法及详解汉诺塔(Hanoi Tower)是一种数学谜题,由法国数学家Édouard Lucas在19世纪中期提出。
这个谜题由三根柱子和一组圆盘组成,圆盘从上到下按照从小到大的顺序放置在柱子上。
问题的目标是将所有圆盘从一个柱子移动到另一个柱子,每次只能移动一个圆盘,并且不能将大的圆盘放在小的圆盘上面。
解决汉诺塔问题的一种常见方法是使用递归算法。
递归是一种数学和计算机科学中常见的方法,通过将复杂的问题分解为更小的相同问题的子问题来解决。
汉诺塔的递归算法主要包含以下步骤:1.将N-1个圆盘从起始柱子移动到中间柱子上,这可以通过将起始柱子作为源柱子,中间柱子作为辅助柱子,目标柱子为空柱子来实现。
这个步骤可以通过递归调用来实现,将起始柱子作为源柱子,中间柱子作为辅助柱子,目标柱子作为空柱子。
2.将第N个圆盘从起始柱子移动到目标柱子上。
3.将N-1个圆盘从中间柱子移动到目标柱子上,这可以通过将中间柱子作为源柱子,目标柱子作为辅助柱子,起始柱子作为空柱子来实现。
这个步骤可以通过递归调用来实现,将中间柱子作为源柱子,目标柱子作为辅助柱子,起始柱子作为空柱子。
下面是一个示例代码,使用递归算法解决汉诺塔问题:```pythondef hanoi(n, source, target, auxiliary):if n > 0:#将N-1个圆盘从起始柱子移动到中间柱子hanoi(n-1, source, auxiliary, target)#将第N个圆盘从起始柱子移动到目标柱子print("Move disk", n, "from", source, "to", target)#将N-1个圆盘从中间柱子移动到目标柱子hanoi(n-1, auxiliary, target, source)#测试n=3hanoi(n, 'A', 'C', 'B')```上述代码中,`hanoi(`函数接受四个参数:圆盘的数量n,起始柱子source,目标柱子target和辅助柱子auxiliary。
python汉诺塔问题
python汉诺塔问题⼀、汉诺塔问题汉诺塔(⼜称河内塔)问题是源于印度⼀个古⽼传说的益智玩具。
⼤梵天创造世界的时候做了三根柱⼦,在⼀根柱⼦上从下往上按照⼤⼩顺序摞着64⽚黄⾦圆盘。
⼤梵天命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放在另⼀根柱⼦上。
并且规定,在⼩圆盘上不能放⼤圆盘,在三根柱⼦之间⼀次只能移动⼀个圆盘⼆、汉诺塔问题分析我们可以将问题简化描述为:n个盘⼦和3根柱⼦:A(源)、B(备⽤)、C(⽬的),盘⼦的⼤⼩不同且中间有⼀孔,可以将盘⼦“串”在柱⼦上,每个盘⼦只能放在⽐它⼤的盘⼦上⾯。
起初,所有盘⼦在A柱上,问题是将盘⼦⼀个⼀个地从A柱⼦移动到C柱⼦。
移动过程中,可以使⽤B 柱,但盘⼦也只能放在⽐它⼤的盘⼦上⾯。
因此我们得出汉诺塔问题的以下⼏个限制条件:1.在⼩圆盘上不能放⼤圆盘。
2.在三根柱⼦之间⼀回只能移动⼀个圆盘。
3.只能移动在最顶端的圆盘。
⾸先,我们从简单的例⼦开始分析,然后再总结出⼀般规律。
当n = 1的时候,即此时只有⼀个盘⼦,那么直接将其移动⾄C即可。
移动过程就是 A -> C当n = 2的时候,这时候有两个盘⼦,那么在⼀开始移动的时候,我们需要借助B柱作为过渡的柱⼦,即将A柱最上⾯的那个⼩圆盘移⾄B柱,然后将A柱底下的圆盘移⾄C柱,最后将B柱的圆盘移⾄C柱即可。
那么完整移动过程就是A-> B , A -> C , B -> C当n = 3的时候,那么此时从上到下依次摆放着从⼩到⼤的三个圆盘,根据题⽬的限制条件:在⼩圆盘上不能放⼤圆盘,⽽且把圆盘从A柱移⾄C柱后,C柱圆盘的摆放情况和刚开始A柱的是⼀模⼀样的。
所以呢,我们每次移⾄C柱的圆盘(移⾄C柱后不再移到其他柱⼦上去),必须是从⼤到⼩的,即⼀开始的时候,我们应该想办法把最⼤的圆盘移⾄C柱,然后再想办法将第⼆⼤的圆盘移⾄C柱......然后重复这样的过程,直到所有的圆盘都按照原来A柱摆放的样⼦移动到了C柱。
hanoi问题的递推公式
hanoi问题的递推公式Hanoi问题是一个经典的数学问题,也是递归问题的典型案例。
在Hanoi问题中,有三根柱子,分别称为起始柱(A柱)、目标柱(C柱)和辅助柱(B柱)。
初始时,起始柱上有n个按照从小到大顺序堆叠的圆盘,目标是将这些圆盘全部从A柱移动到C柱,期间可以利用B柱作为辅助。
递推公式是解决Hanoi问题的关键,它允许我们以递归的方式求解。
在n个圆盘的Hanoi问题中,存在递推公式:T(n) = 2 * T(n-1) + 1,其中T(n)表示移动n个圆盘所需的最小步数。
递归的思路是将问题分解为子问题,先将n-1个盘子从A柱移动到B柱,然后将第n个盘子从A柱移动到C柱,最后将n-1个盘子从B柱移动到C柱。
这样,我们可以得到递推公式。
对于递推公式的证明,可以通过数学归纳法来证明。
首先确定初始条件,即当只有一个盘子时,所需步数为1,即T(1) = 1。
然后假设递推公式对n=k(k≥1)时成立,即T(k) = 2 * T(k-1) + 1。
我们来看n=k+1时的情况,即T(k+1)。
基于递归的思路,对于n=k+1的Hanoi问题,我们需要将k个盘子从A柱移动到B柱,然后将最后一个盘子从A柱移动到C柱,再将k个盘子从B柱移动到C柱。
因此,总步数为:T(k+1) = T(k) + 1 + T(k) = 2 * T(k) + 1。
可以看到,T(k+1)满足递推公式。
由此可知,对于任意正整数n,递推公式T(n) = 2 * T(n-1) + 1成立,可以用来求解Hanoi问题的最小步数。
通过递推公式,我们可以用递归的方式求解Hanoi问题。
当n=1时,递归终止,直接将圆盘从A柱移动到C柱。
对于n>1的情况,我们可以将问题分解为三个子问题,先将n-1个盘子从A柱移动到B柱,然后将第n个盘子从A柱移动到C柱,最后将n-1个盘子从B柱移动到C柱。
这种递归的分解方式可以保证得到最小步数的移动方案。
总结起来,Hanoi问题的递推公式T(n) = 2 * T(n-1) + 1是解决该问题的核心,它允许我们通过递归的方式求解Hanoi问题。
关于Hanoi算法
关于Hanoi算法java经典算法——河内算法(Hanoi)有三根相邻的柱⼦,标号为A,B,C,A柱⼦上从下到上按⾦字塔状叠放着n个不同⼤⼩的圆盘,要把所有盘⼦⼀个⼀个移动到柱⼦B上,并且每次移动同⼀根柱⼦上都不能出现⼤盘⼦在⼩盘⼦上⽅,请问⾄少需要多少次移动,设移动次数为H(n)。
原理: 当n=1时,H(1)=1,即A—>C; 当n=2时,H(2)=3,即A—>B,A—>C,B—>C; 当n>2时,可以将第1个盘⼦到第n-1个盘⼦看成⼀个整体为①,这样就仍为两个盘⼦: 第⼀步:①从A—>B:共H(n-1)步; 第⼆步:n 从A—>C:共1步; 第三步:①从B—>C:共H(n-1)步.public static void main(String args[]) throws IOException {int n;BufferedReader buf;buf = new BufferedReader(new InputStreamReader(System. in ));System.out.print("请输⼊盘数:");n = Integer.parseInt(buf.readLine());Hanoi hanoi = new Hanoi();hanoi.move(n, 'A', 'B', 'C');}public void move(int n, char a, char b, char c) {//第⼆步: 最底下的1个盘⼦,从A移到Cif (n == 1) {System.out.println("盘 " + n + " 由 " + a + " 移⾄ " + c);} else {//第⼀步:把上⾯(n-1)个盘⼦从A移到Bmove(n - 1, a, c, b);System.out.println("盘 " + n + " 由 " + a + " 移⾄ " + c);//第三步:把(n-1)个盘⼦从B移到Cmove(n - 1, b, a, c);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(n 1)! (n r ) (n 1)!r n! r Cn C n1 C n1 r!(n r )! r!(n r )!
2、平面分割问题
问题Ⅰ
问题的提出:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且 任何三条封闭曲线不相交于同一点,求这些封闭曲线把平面分割成的区域个数。
现在要求把1柱上n个圆盘按下述规则移到m柱上: (1) 一次只能移一个圆盘; (2) 圆盘只能在m个柱上存放; (3) 在移动过程中,不允许大盘压小盘。
求将这n个盘子从1柱移动到m柱上所需要移动盘子的最少次数 。
问题Ⅰ:三柱问题
设f(n)为n 个盘子从1柱移到3柱所需移动的最少盘次。 当n=1时,f(1)=1。 当n=2时,f(2)=3。
F(m,n) = min{2*F(m, j)+F(m-1,n-j)} (1<= j < n)
例4:杨辉三角
分析
C C
r n r n 1
C n 1
r 1
组合公式的证明:
(n 1)! C n1 r!(n r 1)!
r
r r 1
(n 1)! C n1 (r 1)!(n r )!
不同的方案数用S(n,m)表示 从中取出bn,bn的放法有以下两种: S(n-1,m-1) 1、bn独自占一个集合;那么剩下的数只能放在m-1个集合中,方案数为; 2、bn与别的数共占一个集合;那么我们可以先将b1,b2,……bn-1这n-1个数划分为m个 集合,然后再将bn可以任意放入其中一个集合中,方案数为 m*S(n-1,m) 综合以上两种情况可以得出: S(n,m)=m*S(n-1,m)+S(n-1,m-1) (n>1,m1) 边界条件:S2(n,1)=1;S2(n,n)=1;S2(n,k)=0(k>n)。
2
【问题分析】: 设f(n)为n条封闭曲线把平面分割成的区域个数。 由图4很容易得出:f(1)=2;f(2)=4。
假设当前平面上已有的n-1条曲线将平面分割成f(n-1)个区域,现在加 入第n条封闭曲线。第n条曲线每与已有的n-1条曲线相交共有2(n-1)个 交点,也就是说第n条曲线被前n-1条曲线分割成2(n-1)段弧线,而每 一条弧线就会把原来的区域一分为二,即增加一个区域,所以共增加 2(n-1)个区域
S(n-1,m-1)
2)bn与别的球共占一个盒子;那么可以事先将b1,b2,……bn-1这n-1个球放入m个 盒子中,然后再将球bn可以放入其中一个盒子中,方案数为 mS(n-1,m)
S(n,m)=mS(n-1,m)+S(n-1,m-1)
问题二:集合划分问题。
设S是一个包含n个元素的集合,S={b1,b2,b3,…,bn},现需要将S集合 划分为m个满足如下条件的集合S1,S2, …Sm。 Si≠∮; Si∩Sj=∮; S1∪S2∪…∪Sm=S; (1<=I ,j<=m) 则称S1,S2, …,Sm是S的一个划分。 编程:输入n和m的值,输出不同的划分方案数。 要求:输入数据有一行,第一个数是n,第二个数m。 样例: 输入:4 3 输出:6
递推法
• 在繁杂的世界变化中,许多现象的变化是有规律 的,这种规律往往呈现出前因后果的关系。即某 种现象的变化结果与紧靠它前面变化的一个或一 些结果紧密关联。这一道理就体现了递推的思想。 • 有类试题,每相邻两项数之间的变化有一定规律 性。通过分析考察,建立后项和前项之间的关系。 然后从初始条件入手,一步步地按递推关系式递 推,直至求出最终结果。如果对一个试题,我们 要是能找到后一项数与前一项数的关系并清楚其 起始条件,问题就比较容易解决,让计算机一步 步计算就可以了。
F(n)=f(n-1)+2(n-1)
问题Ⅱ
问题的提出:一个‘z’形曲线可以把一个平面分割成2部分。如图所示。求n 个‘z’形曲线最多能把平面分割成多少部分。写出递推式f(n)。
【问题分析】: 根据上图容易得出:f(1)=2;f(2)=12。 假设平面上已有n-1个‘z’图形把平面分成了f(n-1)个区域。 加入第n个‘z’后,因为前面的n-1个‘z’共有3(n-1)条边,第 n个‘z’和他们共有3*(3*(n-1))个交点, 即第n个‘z’被分成 3*(3*(n-1)) +1部分,所以增加3*(3*(n-1)) +1个区域,由以上得出: f(n)=f(n-1)+ 3*(3*(n-1)) +1 即:f(n)=f(n-1)+9n-8 初始条件:f(1)=2
F(n)=
f(i - 1) * f(n - i)
i 1
n
4、第二类Stirling数 问题一:放置小球 n个有不同的球放到m个相同的盒子中,要求无一空盒,其不同的方案数用 S(n,m)表示,称为第二类Stirling数 ,求S(n,m)。 设有n个不同的球,分别用b1,b2,……bn表示。从中取出一个球bn,bn 的放法有以下两种: 1方案数为
f(i) * f(n - i -1)
i 0
n 1
为了计算的方便:约定f(0)=1
问题三:出栈序列 问题描述:N个不同元素按一定的顺序入栈,求不同的出栈序列数目。 【问题分析】: 设f(n)为n个元素的不同出栈序列数目。 容易得出:f(1)=1;f(2)=2。 第n个元素可以第i(1<=i<=n)个出栈,前面已出栈有i-1个元素,出栈方 法:f(i-1);后面出栈n-I 个元素,出栈方法为:f(n-i)。所以有: F(n)= 约定: F(0)=1
一、递推式的建立 1、Hanoi塔问题 问题Ⅰ: 三柱问题 问题Ⅱ:四柱问题 问题Ⅲ:m柱问题 2、平面分割问题 问题Ⅰ:封闭曲线分割平面 问题Ⅱ:‘Z’分割平面 问题Ⅲ:‘M’分割平面 3、Catalan数 问题一:凸n边形的三角形剖分 问题二:二叉树数目 问题三:出栈序列 4、第二类Stirling数 问题一:放置小球 问题二:集合划分问题 5、其他 问题一:集合取数问题 问题二:整数划分问题
二、递推式的求解方法: 1. 递归函数 2.用数组实现 3.求递推式的通项表达式: 3.1、迭加法 3.2、待定系数法 3.3、特征方程法 3.4、生成函数法 思考题: 昆虫繁殖 青蛙过河
一、递推式的建立
1、Hanoi塔问题 问题的提出:Hanoi塔由n个大小不同的圆盘和m根木柱1,2,3…….m 组成。开始时,这n个圆盘由大到小依次套在1柱上,如图所示。
2)整数划分问题 将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺 序)。 例如:n=7,k=3,下面三种分法被认为是相同的。 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法。 输入:n,k (6<n<=200,2<=k<=6) 输出:一个整数,即不同的分法。 样例 输入: 7 3 输出:4 {四种分法为:1,1,5;1,2,4;1,3,3;2,2,3;}
通过以上步骤我们可以初步得出: f[i] = 2*f[j]+2^(i-j)-1
j可取的范围是1<=j<I,所以对于不同的j,得到的f[i]可能 是不同的,本题要求最少的移动次数
f[i] = min{2*f[j]+2^(i-j)-1},其中1<=j<I
const MaxNum = 1000; var n : integer; F3, F4 : array[1..MaxNum] of double; procedure Init; var i : integer; begin fillChar(F3,sizeOf(F3),0); fillChar(F4,sizeOf(F4),0); readln(n); F3[1] := 1; F4[1] := 1; {*F3[n] 为Hanoi塔中3根柱子,n个盘子的最少移动次数 F3[n] = 2^n -1; F4[n] 为Hanoi塔中4根柱子,n个盘子的最少移动次数*} for i :=2 to n do F3[i] := 2*F3[i-1] + 1; end;
3、Catalan数
问题一:凸n边形的三角形剖分 在一个凸n边形中,通过不相交于n边形内部的对角线,把n边形拆分成若 干三角形,不同的拆分数目用f(n)表之,f(n)即为Catalan数。例如五边形 有如下五种拆分方案,故f(5)=5。求对于一个任意的凸n边形相应的f(n)。
区域①是一个凸k边形,区域②是一个凸n-k+1边形,区域①的拆分方案总数是f(k) 区域②的拆分方案数为f(n-k+1),故包含△P1PkPn的n 边形的拆分方案数为 f(k)* f(n-k+1)种
问题Ⅲ:‘M’分割平面 问题二的扩展:在问题二的基础上进一步考虑:如果‘z’图形扩展为m边的 下列图形:看一下问题的解。
通过上面的分析我们很容易知道:n个上述图形可以将平面 划分的区域的递推关系: f(n)=f(n-1)+m(m(n-1))+1=f(n-1)+m2(n-1)+1 初始条件:f(1)=2
问题Ⅲ:m柱问题
j
【问题分析】: 设F(m,n)为m根柱子,n个盘子时移动的最少次数:
1、先把1柱上的前j个盘子移动到另外其中一个除m柱以外的非目标柱上,移 动次数为:f[m, j];
2、再把原1柱上剩下的n-j个盘子在m-1根柱子之间移动,最后 移动到目标柱m上,移动次数为:f[m-1, n-j]; 3、最后把非目标柱上的j个盘子移动到目标柱没柱上,移动 次数为:f[m, j]。
以此类推,当1柱上有n(n>2)个盘子时,我们可以利用下列步骤: 第一步:先借助3柱把1柱上面的n-1个盘子移动到2柱上,所需的移 动次数为f(n-1)。 第二步:然后再把1柱最下面的一个盘子移动到3柱上,只需要1次 盘子。 第三步:再借助1柱把2柱上的n-1个盘子移动到3上,所需的移动次 数为f(n-1)。