C/C++ 使用递归算法实现汉诺塔

汉诺塔原理解析:

当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。

            当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。

            当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。

           当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。

          综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样。

[cpp] view
plain
copy

  1. <span style="font-size:14px;">#include <iostream>
  2. using namespace std;
  3. int hannuota(int n,string a,string b,string c)
  4. {
  5. if(n==1)
  6. {
  7. //只有一个盘子的情况下直接将第一个塔上的盘子移动到第三个塔
  8. printf("塔%s------>塔%s\n",a.c_str(),c.c_str());
  9. }
  10. else{
  11. //1.先将第一个塔的n-1个盘子全部通过第三个塔移动到第二个塔上
  12. hannuota(n-1,a, c, b);
  13. //2.再将剩下的一个盘子移动到第三个塔上
  14. printf("塔%s------>塔%s\n",a.c_str(),c.c_str());
  15. //3.最后将第二个塔上的盘子通过第一个塔移动到第三个塔上
  16. hannuota(n-1, b, a, c);
  17. }
  18. return 1;
  19. }
  20. int main(int argc, const char * argv[]) {
  21. printf("请输入盘子的数量:\n");
  22. int n;
  23. scanf("%d",&n);
  24. printf("盘子移动如下:\n");
  25. hannuota(n,"A","B","C");
  26. return 0;
  27. }</span>
时间: 2025-01-13 18:00:32

C/C++ 使用递归算法实现汉诺塔的相关文章

递归算法时间复杂度----汉诺塔

问题:汉诺塔递归算法时间复杂度 算法如下: 解释:size表示汉诺塔的规模,startStack表示汉诺塔起始,endStack 表示完成,midStack表示辅助 def Towers(size,startStack,endStack,midStack): if size == 1: print 'Move disk from ', firstStack, 'to ', endStack else: Towers(size-1,firstStack,midStack,endStack) Tow

Python 实现递归算法之汉诺塔

如图的小游戏,汉诺塔: 游戏的目的是将最左边的三块移动到最右边,游戏即为成功. 下面按照代码的步骤进行移动,三根柱子分别代表了x,y,z: 发现可以实现游戏目的! 当然,三个对于很多人来说并不难实现目标,但是当块变成了5个甚至8个呢 下面,我们来试试7个方块,同样是三根柱子,人的计算就很难实现游戏目标了 所以我们用代码来试试: 可以看到非常长,所以我来按照他的指示来进行游戏 游戏成功! 总共有128步操作,如果人为的来进行游戏的话,很有可能会出错. 所以在此运用了递归算法,编写递归函数来教我们如

数据结构0103汉诺塔&amp;八皇后

主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) { printf("%c-->%c\n",x,z); } else { move(n-1,x,z,y); //将n-1个盘子从x借助z移到y上 printf("%c-->%c\n",x,z); //将第n个盘子从x移到z上 move(n-1,y,x,z);

汉诺塔的递归算法

汉诺塔是怎样通过递归算法实现的? 这个问题困扰了我一段时间,今天回过头来想想似乎明白了,因此在这里记录下自己想法. 首先贴上在Python上的代码: 1 # -*- coding: utf-8 -*- 2 3 def move(n,a,b,c): 4 if n == 1: 5 print(a+"-->"+c) 6 if n > 1: 7 move(n-1,a,c,b) 8 print(a+"-->"+c) 9 move(n-1,b,a,c) 10

C语言之算法初步(汉诺塔--递归算法)

个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考.记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果.现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b.第二,把a上的最下面的盘移到c.第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了.所以算法看起来就简单多了.不过,思考过程还是很痛苦的,难以理解.递归中会保存数据的好处在这里又得到体现,太神奇了. 汉诺塔代码如下:

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

汉诺塔的问题,也是一个经典的递归算法问题. 下面是自己总结的一张整体流程图. 下面是代码,代码虽简单,但理解其内部运行原理很重要. //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename: HanNuoTa.c // description: a demo to

python的递归算法学习(3):汉诺塔递归算法

汉诺塔问题是递归函数的经典应用,它来自一个古老传说:在世界刚被创建的时候有一座钻石宝塔A,其上有64个金蝶.所有碟子按从大到小的次序从塔底堆放至塔顶.紧挨着这座塔有另外两个钻石宝塔B和C.从世界创始之日起,波罗门的牧师就一直在试图把塔A上的碟子移动到C上去,其间借助于塔B的帮助.每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面.当牧师们完成这个任务时,世界末日也就到了. 对于汉诺塔问题的求解,可以通过以下3步实现: (1)将塔A上的n -1个碟子借助C塔先移动到B塔上: (2)

汉诺塔的图解递归算法

一.起源: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 二.抽象为数学问题: 如下图所示,从左到右有A.B.C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上

算法学习(4)----汉诺塔递归算法和非递归算法

学习<算法设计与分析基础>,习题2.4 第5题要求为汉诺塔游戏设计一个非递归的算法. 思,不得其解.看书后答案提示: 你如果做不到,也不要沮丧:这个问题的非递归算法虽然不复杂,但却不容易发现.作为一种安慰,可以在因特网上寻找答案. 好吧,话都说得这么直接了,遂百度之,得到一个感觉很好的答案,略做修改,摘录于下: 原文地址:http://blog.sina.com.cn/s/blog_48e3f9cd01000474.html ##################################