网站开发案例教程,手机网站404页面,网站开发在线打开word,在线做高中试卷的网站汉诺塔游戏规则#xff1a;
规则#xff1a; 汉诺塔问题是一个经典的问题。汉诺塔#xff08;Hanoi Tower#xff09;#xff0c;又称河内塔#xff0c;源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子#xff0c;在一根柱子上从下往上按照大小顺序摞着…汉诺塔游戏规则
规则 汉诺塔问题是一个经典的问题。汉诺塔Hanoi Tower又称河内塔源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定任何时候在小圆盘上都不能放大圆盘且在三根柱子之间一次只能移动一个圆盘。 这篇文章不讲汉诺塔的玩法和实现过程只讲代码为何那么写又是怎样一步一步实现的。其他的基础你们可以去搜索引擎搜索 其实汉诺塔问题难不是难在理解而是难在程序编写的时候很多人理解了汉诺塔的游戏规则也知道怎么去操作但是在写代码的时候就懵了下面举个代码的例子其他语言也是一样的重要的是先了解思路 很多人是在参数变换这里不理解下面我会一步一步的来解析代码每一步的执行过程以及为什么要变换柱子 我们先举例两个圆盘的情况
#include stdio.hvoid hannuota(int n,char A,char B,char C){if(n 1)printf(将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n,n,A,C);else{hannuota(n-1,A,C,B);printf(将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n,n,A,C);hannuota(n-1,B,A,C);}
}int main(){hannuota(2,A,B,C); return 0;
} 代码解析 调用汉诺塔函数首先我们传入的盘子数是 2 定义三根柱子分别为 A、B、C进入函数后对 n 进行判断由于 n 1所以执行 else 的代码块递归调用汉诺塔函数把 n-1 传入并且 A - AB - CC - B。这里三根柱子变了至于为什么变我们接着往下分析。 第一次递归的时候由于 2-11 所以满足 if 条件那么就执行 printf 语句注意了此时的柱子是变了的 A - AB - CC - B 你可以把三根柱子理解为变量里面保存的值变了。 打印这条语句的时候由于 A 保存的值是 AC 保存的值是 Bn 1所以打印的结果就是“将编号为 1 的盘子直接从 A 柱子移动到 B 柱子”这样else 代码块中的第一条代码就执行完成了接下来执行第二条代码用 printf 打印一条信息注意了这里的 nABC 是主函数里传进来的值也就是说 n 2 A AB BC C所以打印的结果是“将编号为 2 的盘子直接从 A 柱子移动到 C 柱子”接着调用第三条代码第二次递归因为次时的盘子位置如下图所示 还需要进行移动把 n-1A BB AC C传给递归函数因为 2-1 满足 if 语句所以直接打印“将编号为 1 的盘子直接从 B 柱子移动到 C 柱子”。至此结束。 上述就是两个盘子的汉诺塔详细的代码实现过程n 个盘子的实现结果也是和上面一样的分析法核心代码不需要变
if(n 1)printf(将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n,n,A,C);else{hannuota(n-1,A,C,B);printf(将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n,n,A,C);hannuota(n-1,B,A,C);} 这里给大家说一下这种递归的题是很抽象的没必要每种情况都去详细分析那样太复杂刚开始学的话容易把自己绕晕你只需要详细了解两三个盘子的情况下代码是怎么跑的这就够了。大家按照我上面的分析方法自己试着去分析三个盘子的情况能分析出来证明你理解了然后就过。