汉诺塔——递归法
Posted i_Crave
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺塔——递归法相关的知识,希望对你有一定的参考价值。
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
汉诺游戏规则如下:
1、有三根相邻的柱子,标号为A,B,C。
2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘。
3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
使用递归法解决问题唯一的共性就是该问题一定有规律!
在做题时,不能具体化思考,当成一个整体比较好想,总结规律如下:
1.将A上n-1个盘借助C先移到B;
2.把A上剩下的盘一个移到C;
3.将n-1个盘从B借助A移到C;
void move(char x, char y)
{
printf("%c-->%c\\n", x, y);
}
void hanoi(int n, char one, char two, char three)//将n盘从A借助B移到C;
//one就是A,two就是B,three就是C
{
if (n == 1)//这是A上只有一个盘时,
{
move(one, three);
}
else
{
hanoi(n - 1, one, three, two);//将n-1盘从A借助C移到B
move(one, three);
hanoi(n - 1, two, one, three);//将n-1盘从B借助A移到C
}
}
汉诺塔问题就是典型的递归,别的方法都不如递归简单,如果上面那个规律没明白的,就带入几个简单的数字列举一下,找打规律就明了多了;
全部代码:
#include <stdio.h>
void move(char x, char y)
{
printf("%c-->%c\\n", x, y);
}
void hanoi(int n, char one, char two, char three)//将n盘从A借助B移到C;
//one就是A,two就是B,three就是C
{
if (n == 1)//这是A上只有一个盘时,
{
move(one, three);
}
else
{
hanoi(n - 1, one, three, two);//将n-1盘从A借助C移到B
move(one, three);
hanoi(n - 1, two, one, three);//将n-1盘从B借助A移到C
}
}
int main()
{
int n;
scanf("%d", &n);
printf("步骤如下:\\n");
hanoi(n, 'A', 'B', 'C');
return 0;
}
以上是关于汉诺塔——递归法的主要内容,如果未能解决你的问题,请参考以下文章
用类比方式学习编程中函数递归(个人理解仅供参考)(内含汉诺塔问题的求解)
左神算法第八节课:介绍递归和动态规划(汉诺塔问题;打印字符串的全部子序列含空;打印字符串的全排列,无重复排列;母牛数量;递归栈;数组的最小路径和;数组累加和问题,一定条件下最大值问题(01背包))