2.6 递归与分治策略(汉诺塔问题)

汉诺塔问题是一个经典问题。

题意理解:有A,B,C三个柱子,将A柱子上的N个盘子(从小到大排列)移到C柱子上,每次只允许移动一个盘子,并且保证每个柱子上的盘子的排列都是从小到大。

分析:由题意可知,如果要将A上的盘子移动到C,那么肯定需要借助C。

首先将A上的盘子从上到下依次编号为1-n。

运用整体思想:

  1、假设1到n-1个盘子是一个整体

  2、将1到n-1个盘子构成的整体移动到B

  3、将第n个盘子移动到C

  4、再将第2步移动到B的整体移动到C就可以了。

  重复以上过程,显然这是一个递归的过程。下面给出代码。

 1 public class a2_6 {
 2     static void Hanoi(int n,char A,char B,char C)  //将A上的盘子移动到C
 3     {
 4         if(n>0){
 5             Hanoi(n-1,A,C,B);  //1、将A上1到n-1个盘子移动到B
 6             move(A,C);//2、将A最下面那个第n个盘子移动到C
 7             Hanoi(n-1,B,A,C);  //3、将B上的1到n-1个盘子移动到C
 8         }
 9     }
10
11     private static void move(char a, char b) {
12         System.out.println(a+"-> "+b);   //第二步,将A上剩余的一个盘移到C;
13     }
14
15     public static void main(String args[]){
16         Hanoi(4,‘A‘,‘B‘,‘C‘);
17     }
18 }

结果大概这么回事:

递归写代码很简洁,但是很容易写错,写错基本就StackOverflowError了,然后递归也比较抽象,不是那么容易理解。所以我的原则是可以不用递归尽量不用,后面有时间找找非递归版本的汉诺塔。本人学渣,不足之处,望各位大佬指正,谢谢!

原文地址:https://www.cnblogs.com/woyaodangxueba/p/10453067.html

时间: 2024-10-11 05:35:26

2.6 递归与分治策略(汉诺塔问题)的相关文章

分治与汉诺塔问题

分治与汉诺塔 分治算法 分治算法介绍 分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 分治算法可以求解的一些经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 分治算法的基本步骤 1.

递归小问题之汉诺塔

递归挺重要的,一定要会 对于汉诺塔的理解,其实是很简单的,但是感觉也挺经典的:假设one,two,thr三个支柱,要将第一个支柱上的n个盘子移到第三个上,输出移动的顺序; 1.其实也就是将n-1个盘子借助thr移到two上, 2.然后将one上的第n个盘子移动到thr上: 3.然后将two上的n-1个盘子移到thr上: 而对于n-1个盘子如何来进行移动,则就属于递归调用了. #include<stdio.h> void move(char x,char y); void hano(int n,

左神算法第八节课:介绍递归和动态规划(汉诺塔问题;打印字符串的全部子序列含空;打印字符串的全排列,无重复排列;母牛数量;递归栈;数组的最小路径和;数组累加和问题,一定条件下最大值问题(01背包))

暴力递归: 1,把问题转化为规模缩小了的同类问题的子问题 2,有明确的不需要继续进行递归的条件(base case) 3,有当得到了子问题的结果之后的决策过程 4,不记录每一个子问题的解 动态规划 1,从暴力递归中来 2,将每一个子问题的解记录下来,避免重复计算 3,把暴力递归的过程,抽象成了状态表达 4,并且存在化简状态表达,使其更加简洁的可能 一:递归 1. 汉诺塔问题 汉诺塔问题(不能大压小,只能小压大),打印n层汉诺塔从最左边移动到最右边的全部过程. 左中右另称为 from.to.hel

基本递归(2)汉诺塔

**本题来自科创网** #include<iostream> using namespace std; int read()//输入函数,用于获取输入的数字(包括两位数和三位数等) { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=get

用递归的方法解决汉诺塔问题

1. A->C->B; 2.B->A-C;

C#中汉诺塔问题的递归解法

百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分为两种情况: 第一种情况是只有一个盘子的情况,也就是最基本的情况,这种情况下,直接将该盘子从原始塔转移到目标塔即可胜利: 第二种情况是右n个盘子的情况,也就是普遍情况,这种情况下,要将除了最底下的那个盘子以外的(n-1)个盘子从原始塔转移到辅助塔,再把最底下的那个盘子(第n个盘子)从原始塔转移到目标

汉诺塔的递归算法与解析

从左到右 A  B  C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面. 如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号. 小时候玩过这个游戏, 基本上玩到第7个,第8个就很没有耐心玩了,并且操作的动作都几乎相同觉得无聊.  后来学习编程, 认识到递归, 用递归解决汉诺塔的算法也是我除了简单的排序算法后学习到的第一种算法. 至于递归,简单来说

算法:汉诺塔

[递归经典题目]汉诺塔算法 Java实现 汉诺塔非递归算法

2017.11.26 计算机算法之分治与递归——汉诺塔

1.我的递归算法(纯粹的递归) #include <stdio.h>//当盘子数n等于15时,移动次数已经达到32767,运行时间已经达到15.540s long long count; void hanoi(int n,char a,char b,char c)//借助C将A上的盘子全部移动到B { if(n==0) return; hanoi(n-1,a,c,b); printf("%c --> %c\n",a,b); count++; hanoi(n-1,c,b