递归函数之汉诺塔(附:raptor汉诺塔)

简介: 递归函数之汉诺塔(附:raptor汉诺塔)

关于汉诺塔的神话故事:

 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。


1.汉诺塔问题:

题目:

      有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子C上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动

分析问题:

       首先,知道有三个柱子 A B C,然后在A柱中放着从小到大的n个圆盘,这时要把全部圆盘移动到C柱上,并且保证递增大小的前提。

               那么可以先把A柱看成起始柱

               然后再把B柱看成辅助柱

               最后把C柱看成目标柱

假设就n = 3,那么可以想到:A->C(此时先把最上面最小的移动到C),A->B(再把第二小的放在B处),C->B(再把最小的移到B处此时任然满足从小到大),A->C(把A中最下面也是A中最大的放在目标C处)。B->A(在把B上最小的在放在A出),B->C(第二小的放到C),最后把A->C(就完成了)

其中蓝色部分和橙色部分也是分别的递归不过他们的起始柱辅助柱和目标柱不同。

蓝色部分:他的起始柱是A,目标柱是B,辅助柱是C

橙色部分:他的起始柱是B,目标柱是C,辅助柱是A

总结:

在写n个圆盘时,我们可以先将n-1个圆盘移动到B柱上( 目标柱:B柱,辅助柱:C柱),然后再把最大的一个圆盘移动到C柱,最后再把n-1个圆盘移动从B柱上移到C柱上(目标柱:C柱,辅助柱:A柱)

通过上面的总结我们就能很容易的去写代码

 #define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Tower(char a, char b, char c, int n)
{
  if (n == 0)
    {
        return;//当圆盘为0是返回
    }
  Tower(a, c, b, n - 1);
  printf("%c -> %c", a, c);//把最大的盘放到C柱
  Tower(b, a, c, n - 1);
}
int main()
{
  int num = 0;
  scanf("%d", &num);
  Tower('A','B','C', num);
  //A B为辅助柱,A也是起始柱
  //C为目标柱
  return 0;
}

raptor实现:

image.png

相关文章
|
2月前
|
算法
|
12月前
1205:汉诺塔问题
1205:汉诺塔问题
|
12月前
汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
50 0
汉诺塔+小青蛙跳台阶---《递归》
汉诺塔+小青蛙跳台阶---《递归》
|
Java C语言
【JavaOJ】汉诺塔问题
JavaOJ & 汉诺塔问题
60 0
汉诺塔?爬楼梯?斐波那契?知道递归就够了
汉诺塔?爬楼梯?斐波那契?知道递归就够了
71 0
|
C语言
【C】青蛙跳台阶和汉诺塔问题(递归)
【C】青蛙跳台阶和汉诺塔问题(递归)
100 0
【C】青蛙跳台阶和汉诺塔问题(递归)
|
C++
【C/C++】汉诺塔问题
## 汉诺塔问题相传来源于印度教的天神汉诺。据说汉诺在创造地球时建了一座神庙,神庙里面有三根柱子,汉诺将64个直径大小不同的盘子按照从大到小的顺序依次放置在第一个柱子上,形成金塔(即汉诺塔)。天神汉诺每天让庙里的僧侣们将第一根柱子上的64个盘子借助第二根柱子全部移动大第三根柱子上,并说:“当这64个盘子全部移动到第三根柱子上时,世界末日也就要到了!”这就是著名的汉诺塔问题。
118 0
【C/C++】汉诺塔问题
|
算法
算法练习——(9)汉诺塔问题
一.传说: 二.数学问题: 三.递归算法:
126 0