递归

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

  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. java 方法 在jvm中的调用

    java 某个类的几个对象,这些对象调用类中一个函数,是各自拥有自己的函数代码还是使用同一段代码?30 1.java 某个类的几个对象,这些对象调用类中一个函数(普通的函数),是各自拥有自己的函数代码 ...

  2. 虚拟机VMware 安装后虚拟机网卡与主机网卡数据交换关系

    安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后面会详细介绍.在VMware Worksta ...

  3. python操作MySQL数据库报错问题解决

    编写好Python操作数据库的脚本后,运行报错如下: 报错1:“AttributeError: 'NoneType' object has no attribute 'encoding'” 解决办法: ...

  4. web form常用控件

    表单元素一共12个分三大类 文本类<input type="text" />             文本框<input type="password& ...

  5. git分支,git commit,git流程

    1. git分支命令规范 1. Master 主分支 2. Dev 开发分支 3. Feature 功能分支(例如:feature-x) 4. Release 预发布分支(例如:release-1.2 ...

  6. 1. git 本地给远程仓库创建分支 三步法

    命令如下: 1:本地创建分支dev 1 2 Peg@PEG-PC /D/home/myself/Symfony (master) $ git branch dev 2:下面是把本地分支提交到远程仓库 ...

  7. 它来了!它来了!Seata Go Client 它来了!!!

    抱歉抱歉,这个标题一看就是个很标题党的标题.本文所述的 Seata Go Client 只支持 TCC 模式,并不像 Java 版的能支持到 AT 模式.SAGA 模式.XA 模式,聊胜于无.说到这里 ...

  8. 浏览器插件之王-Tampermonkey(油猴脚本)

    大家电脑都在使用浏览器,相信大家对浏览器插件也不陌生,浏览器插件是安装在浏览器里面,对浏览器功能进行拓展的脚本,现在的主流浏览器都有各种各样的插件如图: 这些插件让我们的上网方便了许多,有去广告的插件 ...

  9. TensorFlow keras 迁移学习

    数据的读取 import tensorflow as tf from tensorflow.python import keras from tensorflow.python.keras.prepr ...

  10. AWR发现TOP Event log file sequential read

    对客户DB进行巡检,发现TOP EVENT是LOG FILE Sequential read 等待事件说明 https://www.xuebuyuan.com/zh-hant/1743045.html ...