hanoi塔问题的递归实现
2018-02-11 11:03
141 查看
一、背景故事
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。(来自百度百科)
二、问题描述
![](https://img-blog.csdn.net/20180211163133924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2luYXRfMzg4MTY5MjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
假设有x,y,z三座塔座。在塔座x上有n个直径各不相同、依次从小到大的编号为1,2.........,n的圆盘。现要求将x座上的盘子移动到z上,移动要求如下:
1、一次只能移动一个盘子。
2、盘子只能插在x,y,z的某个塔座上。
3、任何时刻不能将较大的盘子压在较小的盘子上。
如何移动盘子呢?当只有一个盘子时,即n=1。此时直接将x上的盘子移动到z上即可。当n等于2时,先将第一个盘子移动到y上,再将第二个盘子移动到z上,最后将y上的盘子移动到z上。当n大于1的时候,将上面n-1个盘子通过z移动到y上,再将x上的一个盘子移动到z上,再将y上的盘子通过x移动到z上......
三、程序
#include<stdio.h>
void hanoi(int n,char a,char b,char c)
{
if(n==1)
printf("%c-->%c\n",a,c);
else
{
hanoi(n-1,a,c,b);//将a上的盘子通过c移动到b上,这句话很好
printf("%c-->%c\n",a,c);//可以仔细想想这c是什么柱子,挺好玩的
hanoi(n-1,b,a,c);
}
}
void main()
{
hanoi(5,'x','y','z');
}
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。(来自百度百科)
二、问题描述
假设有x,y,z三座塔座。在塔座x上有n个直径各不相同、依次从小到大的编号为1,2.........,n的圆盘。现要求将x座上的盘子移动到z上,移动要求如下:
1、一次只能移动一个盘子。
2、盘子只能插在x,y,z的某个塔座上。
3、任何时刻不能将较大的盘子压在较小的盘子上。
如何移动盘子呢?当只有一个盘子时,即n=1。此时直接将x上的盘子移动到z上即可。当n等于2时,先将第一个盘子移动到y上,再将第二个盘子移动到z上,最后将y上的盘子移动到z上。当n大于1的时候,将上面n-1个盘子通过z移动到y上,再将x上的一个盘子移动到z上,再将y上的盘子通过x移动到z上......
三、程序
#include<stdio.h>
void hanoi(int n,char a,char b,char c)
{
if(n==1)
printf("%c-->%c\n",a,c);
else
{
hanoi(n-1,a,c,b);//将a上的盘子通过c移动到b上,这句话很好
printf("%c-->%c\n",a,c);//可以仔细想想这c是什么柱子,挺好玩的
hanoi(n-1,b,a,c);
}
}
void main()
{
hanoi(5,'x','y','z');
}
相关文章推荐
- 栈与递归的实现(Hanoi塔问题等等)
- 递归实现hanoi塔问题算法
- Hanoi塔问题 栈与递归C语言编程实现
- 0-1背包问题递归和非递归实现
- php实现汉诺塔问题(递归)
- 简单的[0/1]背包问题 分别用递归与非递归实现
- 常用算法的递归实现问题分析(针对《数据结构与程序设计》by Robert.L.Kruse)
- 栈与递归的实现:n阶Hanoi塔的算法分析与源码
- 迷宫问题--非递归回溯 C语言实现
- 动态规划算法求解找硬币问题的递归与非递归实现
- 数据结构的应用——使用栈和递归实现Hanoi问题求解
- 0-1背包问题的递归实现与非递归实现
- XSLT实现XML无极限树(精简版)[二] 解决没有递归出节点属性值总和的问题(JS实现)
- 简单的背包问题--java递归实现
- 非递归形式的N皇后问题---用C#实现,VS2008可以执行
- 汉塔问题 C递归实现
- 货船装箱问题的递归和非递归实现
- 背包问题非递归实现
- 递归实现背包问题
- 通过8皇后问题浅析回溯法的递归实现