递归问题闲究——汉诺塔问题
Posted 知晓天空之蓝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归问题闲究——汉诺塔问题相关的知识,希望对你有一定的参考价值。
事情是这样的:上次写完递归,本来说顺理成章走到数组开始学习,之前因为懒狗本性把两个自主研究问题抛出后就“事了拂身去”;结果今天突然良心发现,打算重新做人,于是就决定码一码,结果码了三小时愣是没给拿捏完美。这里有感特此写两篇博客纪念这段心路历程。
汉诺塔问题和青蛙跳台阶问题是经典的递归问题。汉诺塔问题是一个经典的问题,汉诺塔(Hanoi Tower)又称河内塔,源于印度一个古老传说:大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘,问该如何操作(图片引自百度)。
其实,递归的核心在于函数自己调用自己,首先思路是创建所需的变量,三根柱子,即创建三个字符类型A,B,C和代表次数的整型n;我用 printf函数模拟它的实验结果;在根据我们所需的计算要求自义定函数 Hanoi,接下来就是把我们的计算过程串联进去,加入魔法,赋予灵魂。
#include<stdio.h>
void Hanoi(int n, char a, char b, char c)// 初始化自定义函数Hanoi
{
if (1 == n)// if语句首先踢出特殊情况1
{
printf("Move %d:from %c to %c\\n",n,a, b);// 为1时直接a到b
}
else
{
Hanoi(n - 1, a, b, c);//>1时,先将(n-1)个盘子从a借助b移到c
printf("Move %d:from %c to%c\\n",n, a, b);//将a上第n个移到b
Hanoi(n - 1, c, a, b);//将c上的(n-1)个盘子从c借助a移到b
}
}
int main()
{
int n = 0;//定义圆盘数n
printf("please input the number of disks:");
scanf("%d", &n);
printf("steps of moving the disks=%d\\n", n);
Hanoi(n, \'A\', \'B\', \'C\');
return 0;
由此上的代码可得如下结果: 大概过程就是如此,中间许多地方可能打磨的不够细的,还望多多指教。
小青蛙给sei下一篇吧,觉着得好好的写写,那么今天先到此为止,眠了,家人们。
以上是关于递归问题闲究——汉诺塔问题的主要内容,如果未能解决你的问题,请参考以下文章