递归汉诺塔

/*汉诺塔的玩法:

* 游戏的规则:将A柱上的盘子移动到C柱上,大盘必须在小盘之上。

* 1 当A柱上只有一个盘子的时候,直接移动到C柱上;

* 2 当A柱上有两个盘子的时候,

*   将A柱上的1盘(从上到下编号)移动到B柱,

*   将A柱上的2盘移动到C柱,

*   将B柱上的1盘移动到C柱;

*   (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱)

* 3 当A柱上有三个盘子的时候,将A柱上的1~2盘移动到B柱,

*   将A柱上的3盘移动到C柱,

*   将B柱上的1~2盘移动到C柱

*   (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱)

* n 当A柱上有n个盘子的时候,将A柱上的1~n-1盘移动到B柱,

*   将A柱上的n盘移动到C柱,

*   将B柱上的1~n-1盘移动到C柱。

*   (将A上的1~n-1盘---->B柱,将A柱上n---->C柱,B柱上的1~n-1盘---->C柱)

* */

 1 #include<stdio.h>
 2
 3 void Hanoi(int count,char a,char b,char c){
 4   if(count == 1){
 5     printf("FROM %c TO %c\n",a,c);
 6   }else
 7   {
 8     Hanoi(count-1,a,c,b);
 9     printf("FROM %c TO %c\n",a,c);
10     Hanoi(count-1,b,a,c);
11   }
12 }
13 int main(){
14   printf("please input the number of Hanoi:");
15   int n;
16   scanf("%d",&n);
17   Hanoi(n,‘A‘,‘B‘,‘C‘);
18   return 0;
19 }

通常系统通常在一个函数运行期间调用另一个函数时,在运行被调用的函数之前,系统需要做3件事:(1)将所有的实参,返回地址等信息传递给被调用的函数保存。(2)为被调用的函数的局部变量分配存储区。(3)将控制转到被调用的函数的入口。从而在被调用的函数返回调用函数之前,系统通常也要做3件事:(1)保存被调函数的计算结果(2)释放被调函数的数据区(3)依照被调函数保存的返回地址将控制返回到调用函数。当有多个函数嵌套调用,按照先调用的后返回的原则,上述函数之间的信息传递和控制的转移必须必须通过栈来实现,即系统见整个程序运行期间的所需要的数据空间安排在一个栈中,每当调用一个函数就为它在栈顶分配一个存储区,每当一个函数退出运行时,就释放他的存储区,则当前正在运行的函数的数据必须是在栈顶的。递归函数的执行过程相当于多个韩式的嵌套调用,只是调用函数和被调用的函数是同一个函数。为了保证递归函数的正确进行,系统设立了一个递归工作栈作为真个递归函数运行期间使用的数据存储区,每一层递归所需的信息构成一个“工作记录”。其中包括所有的上一层的返回地址,所有的局部变量和实在的参数。每当进入一层递归,就产生一个新的工作记录压入栈顶,每当退出一层递归,就从栈顶弹出一项工作记录。

void Hanoi(int count,char a,char b,char c)

1  {

2     if(count == 1)

3        printf("FROM %c TO %c\n",a,c);

4     else{

5        Hanoi(count-1,a,c,b);

6        printf("FROM %c TO %c\n",a,c);

7        Hanoi(count-1,b,a,c);

8     }

9  }

下表给出了递归的执行过程,返回地址是程序中的代码的行号,主函数的地址为0;

时间: 2024-11-05 12:06:10

递归汉诺塔的相关文章

【数据结构与算法】递归汉诺塔

汉诺塔 汉诺塔是根据一个传说形成的数学问题(关于汉诺塔): 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 递归汉诺塔 解题思路: 可以把问题简化成2个盘子的情况,如:A上有两个盘子,B和C是空的.如果要把A的两个盘子全部移动到C,需要经过以下步骤: 1.A移动一个盘子到B 2.A移动一个盘

Acdream 1219 The Towers of Hanoi Revisited(递归汉诺塔问题)

传送门 The Towers of Hanoi Revisited Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You all must know the puzzle named "The Towers of Hanoi". The puzz

2017.11.26 计算机算法之分治与递归——汉诺塔

1.我的递归算法(纯粹的递归) #include <stdio.h>//当盘子数n等于15时,移动次数已经达到32767,运行时间已经达到15.540s long long count; void hanoi(int n,char a,char b,char c)//借助C将A上的盘子全部移动到B { if(n==0) return; hanoi(n-1,a,c,b); printf("%c --> %c\n",a,b); count++; hanoi(n-1,c,b

递归——汉诺塔问题(python实现)

规则 每次移动一个盘子 任何时候大盘子在下面,小盘子在上面 方法 假设共n个盘子 当n=1时: 直接把A上的一个盘子移动到C上(A->C) 当n=2时: 把小盘子从A放到B上(A->B)这里开始采用参数,rsc源地址=A,dst目的地址=B 把大盘子从A放到C上( A->C)rsc=A, dst=C 把小盘子从B放到C上(B->C)rsc=B, dst=C 当n=3时: 把A上的两个盘子,通过C移动到B上去, 调用递归实现(A-C->B)rsc=A, trans中转=C, d

递归--汉诺塔问题 (Hanoi)

汉诺塔问题(Hanoi):古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求输出移动的步骤 . 结题思路:利用递归思想结题,就是找出其每步的共同规律,然后必须有一步是递归的终止条件. 先假设第一种情况:3根柱,从左到右A,B,C,上面小号,底部大号,从上往下递增. 如要完成该任务,经历3

函数递归——汉诺塔经典题型

理解汉诺塔游戏规则,有A,B,C座塔,将A塔上的圆盘移动到C塔上,当A塔只有一块圆盘时,直接移动到C塔,当A塔有N个圆盘时,需要将N-1个圆盘移动到B塔,然后将剩下的最底下圆盘移动到C.大盘不能压住小盘 汉诺塔游戏主要考虑到最底下圆盘的调用,每次的移动都假设到最底下圆盘. 其实到目前我还是不太明白 def move(n, x, y, z): if n==1: print (x,'-->',z) return move(n-1,x,z,y)#将前n-1个盘子从x移动到y上 move(1,x,y,z

python 递归-汉诺塔

# 汉诺塔 a = "A" b = "B" c = "C" def hano(a, b, c, n): if n == 1: print("{} --> {}".format(a, c)) if n == 2: print("{} --> {}".format(a, c)) print("{} --> {}".format(a, b)) print("{} -

PKU《程序设计》专项课程_递归汉诺塔问题

取自coursera.org上公开课北京大学<C程序设计进阶> 递归调用注意的点 1.关注点放在求解的目标上,递推是,目标放在开头 2.找到第N次和第(N-1)次之间的关系,通项公式 3.给出边界(比如第1次执行结果,斐波那契数列是第1次和第2次结果) #include <iostream> using namespace std; void move(int m,char x, char y,char z) { if(m==1) { cout<<"把一个盘子

递归--汉诺塔

---恢复内容开始--- //n:盘子个数 a,b,c用字符表示三根柱子 void hanoiTower(int n, char a, char b, char c) { static int step = 0; if (n == 1) { cout << ++step<<": "<<a << "→" << c << endl; return; } else { hanoiTower(n - 1