递归

顾名思义,递归就是递归就是递归就是递归就是递归......就是递归

  Google递归:

  

走迷宫(较容易):

  构建一个二维数组(如下图),其中1表示围墙,0表示通路,现要求从起点走到终点。利用递归可以以少量代码实现。

由于比较简单,直接上代码分析:

  参数 i,j 为迷宫起始坐标,而要走出迷宫,必须绕过围墙1,走迷宫当然有策略,这里比较简单的给出了下右上左的次序判断是否通路,同样也可以上右下左,左上右下,左下右上,注意必须是闭环的,否则绝对走不出迷宫!(这里强烈建议按照代码自己思考走一遍或者debug分析一下)

 1 // 下右上左
2 public static boolean setWay(int[][] array, int i, int j) {
3 if (array[6][6] == 7)//判断每一种选择最后是否能走出迷宫
4 return true;
5 else {
6 if (array[i][j] == 0) {
7 array[i][j] = 7;//表示此坐标已经来过,下面接着判断各种情况
8 if (setWay(array, i + 1, j))
9 return true;
10 else if (setWay(array, i, j + 1))
11 return true;
12 else if (setWay(array, i - 1, j))
13 return true;
14 else if (setWay(array, i, j - 1))
15 return true;
16 else {
17 array[i][j] = 3;
18 return false;
19 }
20 } else
21 return false;
22 }
23 }

八皇后:

八皇后小游戏:  http://www.4399.com/baidugame/42643.htm    八皇后的规则很简单,但是实现不易,八皇后规定每一个皇后都必须在不同行不同列且不在一个对角线上。

这里给出92种摆法的一部分,感兴趣的朋友可以点击上面连接进行游戏测试

0 4 7 5 2 6 1 3
0 5 7 2 6 3 1 4
0 6 3 5 7 1 4 2
0 6 4 7 1 3 5 2
1 3 5 7 2 0 6 4

  重点看一下这个分析图,用心一看,绝对明白了。

核心代码分析:

 1     public void check(int n) {
2 if (n == max) {
3 print();
4 return;
5 }
6 for (int i = 0; i < max; i++) {
7 array[n] = i;// 这里的i代表列,array[n]代表当前皇后放到第i列
8 if (judge(n)) {// 判断当前皇后n是否满足条件
9 check(n + 1);//满足条件,判断下一个皇后
10 }
11 }
12 }
13
14 //此方法主要判断当前皇后能否摆放
15 public boolean judge(int n) {
16 for (int i = 0; i < n; i++) {// 此处i代表已经摆好的皇后序号,array[i]代表第i个皇后所在的列数, n代表当前的皇后,array[n]代表当前皇后所在的列数
17 //将当前第n个皇后的列array[n]和前n个皇后的列进行比较,还有斜率比较
18 if (array[n] == array[i] || Math.abs(n - i) == Math.abs(array[n] - array[i]))
19 return false;
20 }
21 return true;
22 }

汉诺塔(分治法):

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
  假如按照上面规则去移动,一秒移动一次,那么这表明移完这些金片需要5845.42亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。
 
为什么呢?基本过程看图:类似有规则的搭积木。

   以上示图分析,以3片为例,一共需要移动7次。

   思路分析:将所有片看作两部分,最底下一片和上面所有片;接着将上面所有片分为两部分,最底下一片和上面所有片......

        1、将所有上层片,从A放到B位置上

        2、然后剩余最底下的一片,从A放到C位置上

        3、接着将B盘中所有片放到C位置上

   以上是宏观上的步骤,而真正移动是在回溯的时候。用图说明一下:

   方法在执行的时候是按照栈帧执行的,下面也就是模拟了一遍3片的执行过程。

 1   //参数说明:num表示有多少片,abc依次表示三个容器
2 public static void hanoitower(int num,char a,char b,char c){
3 if (num==1)
4 System.out.println("第1个盘从"+a+"->"+c);//
5 else {
6 //2个及多个盘子:第一步将其分成两部分:最下面的和所有上层的;
7 hanoitower( num-1,a,c,b );//第一步将上层所有的盘子放到B位置,递归直到上层为1
8 System.out.println("第"+num+"个盘从"+a+"->"+c);//将所有相对于处于下层的盘子一个一个放到C
9 hanoitower( num-1,b,a,c );//将B中的所有盘子,放到C位置上,完成
10 }
11 }

数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)的更多相关文章

  1. "递归"实现"约瑟夫环","汉诺塔"

    一:约瑟夫环问题是由古罗马的史学家约瑟夫提出的,问题描述为:编号为1,2,-.n的n个人按顺时针方向围坐在一张圆桌周围,每个人持有一个密码(正整数),一开始任选一个正整数作为报数上限值m,从第一个人开 ...

  2. 用函数递归的方法解决古印度汉诺塔hanoi问题

    问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规 ...

  3. 汉诺塔算法的递归与非递归的C以及C++源代码

    汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...

  4. 汉诺塔算法c++源代码(递归与非递归)[转]

     算法介绍: 其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n - 1(有兴趣的可以自己证明试试看).后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了.首先把三根柱 ...

  5. [Python3 练习] 005 汉诺塔1 递归解法

    题目:汉诺塔 I (1) 描述 传说,在世界中心贝拿勒斯(在印度北部)的圣庙外有左中右三根足够长的柱子(塔) 左边柱子上套着 64 片金片,金片按"上小下大"排,其余两根是空柱子 ...

  6. PTA 汉诺塔的非递归实现(C 语言)

    借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c), 即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”), 并保证每个移动符合汉诺塔问题的要求 ...

  7. JAVA递归算法及经典递归例子 对于这个汉诺塔问题

    前言:递归(recursion):递归满足2个条件 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 第一题:汉诺塔 对于这个汉诺塔问题,在写递归时,我们只需要确定两个条件: ...

  8. hanoi(汉诺塔)递归实现

    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序 ...

  9. C语言数据结构----递归的应用(八皇后问题的具体流程)

    本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...

随机推荐

  1. windows上jmeter目录结构功能

    1.bin :存储了jmeter的可执行程序,如启动 2.lib:存储了jmeter的整合的功能(如.jar文件程序) 3.启动jmeter:双击bin\apachejmeter.jar jmeter ...

  2. Linux Mint(Ubuntu)如何管理开机自动启动项?

    Linux Mint自带了一个简洁的开机自启管理应用,使用方法也很简单: 依次点击“Menu”==>“控制中心”==>“个人”==>“启动应用程序”,界面如图所示: 上面打勾的就是系 ...

  3. intellJ svn控制错误

    电脑突然蓝屏了,重启打开intellj 后原本好好的项目是可以用intellj更新或者提交的,现在却都不能了,如图: 如上图:svn地址里是空白的,应该显示: 那到底是什么情况呢,就因为电脑崩溃了in ...

  4. MyEclipse 10安装SVN插件subclipse

    1. 下载SVN插件subclipse 下载地址:http://subclipse.tigris.org/servlets/ProjectDocumentList?expandFolder=2240& ...

  5. 【three.js第四课】自定义材料、贴图。

    1.先去下载6张不同的图片素材放到项目中. 2.在[three.js第三课]的代码基础上添加自定义的材料 //自定义材料 cubeMaterial 数组 //map:用于加载图片,THREE.Text ...

  6. IOCP完成端口

    转:https://blog.csdn.net/piggyxp/article/details/6922277 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所 ...

  7. 用Python介绍了企业资产情况的数据爬取、分析与展示。

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:张耀杰 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  8. L12 Transformer

    Transformer 在之前的章节中,我们已经介绍了主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs).让我们进行一些回顾: CNNs 易于并行化,却不适合捕捉变长序列内的依赖关 ...

  9. [YII2] 去除自带头部以及底部右下角debug调试功能

    YII2 去除自带头部以及底部右下角debug调试功能

  10. 每天都在用,但你知道 Tomcat 的线程池有多努力吗?

    这是why的第 45 篇原创文章.说点不一样的线程池执行策略和线程拒绝策略,探讨怎么让线程池先用完最大线程池再把任务放到队列中. 荒腔走板 大家好,我是 why,一个四川程序猿,成都好男人. 先是本号 ...