汉诺塔

递归解决汉诺塔问题

末鹿安然 提交于 2019-11-27 16:03:05
汉诺塔问题 问题描述 代码实现 问题描述 哈哈哈哈哈哈,自己去4399玩 汉诺塔游戏 代码实现 package com.wuxudong.recursion; //汉诺塔问题 public class Hanoi { public static void main(String[] args) { hanoi(5,'A','B','C'); } /** * * @param n 盘子的个数 * @param from 开始的柱子 * @param in 中间的柱子 * @param to 目标柱子 */ public static void hanoi(int n, char from,char in, char to){ //只有两个情况,只有一个盘子和其它大于一个盘子的情况 //只有一个盘子 if(n==1){ System.out.println("第1个盘子从"+from+"移动到"+to); }else { //无论有多少个盘子都看成两个盘子,上面所有n-1个盘子和下面的一个盘子 //将上面的盘子移动到中间位置 hanoi(n-1,from,to,in); //将第n个盘子移动到目标柱子 System.out.println("第"+n+"个盘子从"+from+"移动到"+to); //将中间柱子的盘子移动到目标柱子 hanoi(n-1,in,from,to); } }

数据结构与算法基础之汉诺塔---手写出栈压栈过程实现

て烟熏妆下的殇ゞ 提交于 2019-11-27 12:50:39
        具体的代码请看我上一篇文章! 递归执行过程(调用方法的栈机制:不停的压栈、出栈(特点:先进后出)):   假如输入的盘子个数为 2 : 主函数传参hanoit(2,’A‘,‘B','C'), 压栈1 。 n!=1,于是递归执行 hanoit(2-1,A,C,B), 压栈2 。 n==1,输出语句, 压栈3 ,输出“将编号为1的盘子从A柱移到B柱", 出栈3 。 函数hanoit(2-1,A,C,B) 出栈2 执行下一条输出语句, 压栈2 ,输出”将编号为2的盘子从A柱移到C柱“, 出栈2 执行递归 hanoit(2-1,B,A,C), 压栈2 ,输出”将编号为1的盘子从B柱移到C柱“, 出栈2 函数hanoit(2,’A‘,‘B','C') 出栈1 程序执行完毕 假如输入的盘子个数为 3 :(较为麻烦,需要不断交替参数) 主函数传参 hanoit(n=3,A=’A‘,B=‘B',C='C') , 压栈1 。此时A=A、B=B、C=C n==3,递归 执行hanoit(3-1,A,C,B), 压栈2 。此时A=A==A、B=C==C、C=B==B n==2,递归 执行hanoit(2-1,A,C,B), 压栈3 。此时A=A==A、B=C==B、C=B==C n==1,输出语句, 压栈4 ,输出“将编号为 1 的盘子从 A 柱移到 C 柱", 出栈4 。

数据结构与算法基础之汉诺塔

随声附和 提交于 2019-11-27 11:19:44
  汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 伪算法(重点理解): 1 if( n>1 ){ 2 先把A柱子上的前n-1个盘子从A借助C移到B//重点 3 将A柱子上的第n个盘子直接移到C//第n个就是最下面的一个 4 再将B柱子上的n-1个盘子从B借助A移到C//重点 5 } 三个盘情况:移动盘子次数为7 四个盘情况:移动盘子次数为15 假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。 1 #include<stdio.h> 2 3 //函数的形参A、B、C不一定代表的是A、B、C柱子,递归传参的时候会变化! 4 void hanoit(int n,char A,char B,char C){ 5 if(n==1){ 6 //如果剩下一个盘子,直接将A柱子上的盘子从A移到C(直接从初始塔移动到目标塔) 7 printf("将编号为%d的盘子从%c柱子移到%c柱子",n,A,C); 8 } 9 else{ 10 //否则,先将A柱子上的n-1个盘子从A借助C移到B