数据结构与算法学习笔记5--------递归算法

1.迷宫问题

迷宫问题的情景是这样的,有一个迷宫,其中有墙壁,也就是无法到达的地方,设置一个起点,一个终点,让目标寻找路线,如果找到返回true 否则返回false
/**
	 * 
	 * @param map地图
	 * @param i 确定坐标
	 * @param j 确定坐标
	 * @return 找到了返回true 否则返回false
	 */
	 //map[6][5]是终点
	//约定 map[i][j]=0表示没有走 为1表示不能走 为2表示这是一个通路
	//需要定义一个寻路策略比如 下->右->上->左
	public static boolean setWay(int[][] map,int i,int j) {
		if(map[6][5]==2) {//此时通路已经找到
			return true;
		}else {
			if(map[i][j]==0) {//如果当前这个点没走过
				map[i][j]=2;
				if(setWay(map, i+1, j)) {//向下走
					return true;
				}else if(setWay(map, i, j+1)) {//向右走
					return true;
				}else if(setWay(map, i-1, j)) {//向上走
					return true;
				}else if(setWay(map, i, j-1)) {//向左走
					return true;
				}else {
					//说明此路不通
					map[i][j]=3;
					return false;
				}
			}else {//此处值可能为1,2,3
				return false;
			}
		}
		
	}

这个算法的核心是setWay函数 传入的i j 参数是目标的初始位置,下面让我来分析一下

首先,第一句话说的是递归出口,当第七行第六列这个位置已经走通了,也就是说明已经抵达终点,此时返回true,每个递归算法都必须要有一个递归出口

当还没到终点时,就要分两种情况,一是当前这个i,j位置还没走过,另一种情况则是走过,是墙,走不通三种情况的合集,故直接返回false即可,重点在于此位置没走的情况。

先给此处赋值2 也就是通路 然后约定一个寻路策略,因为代码是从上到下执行的,所以往上还是往下往左还是往右是需要确定的,本代码是下右上左。这里就要递归了,重点来了!

此时是i,j,在if里调用了i+1,j,也就是把当前位置向下走了一个,这样又会进入一个函数,这个函数中的i比原来大1,然后又会执行各种判断,假如往下走遇到墙了,就会往右找路,这样会有两种情况,一是在调用很多层函数后找到了,这时会返回true,二是没找到,则最上层的栈帧返回false,第二层继续找别的方向,若四个方向都不通,最后就返回false了。

2.八皇后

八皇后的核心函数有两个,一个是判断放的棋子和之前的是否冲突的judge函数,一个是运用递归来放棋子的check函数
//放置第n个皇后时 判断当前的是否符合规则 是否和之前的冲突
	private boolean judge(int n) {
		for(int i=0;i<n;i++) {
			//1.两棋子不在一列上 2.两棋子不在一个斜线上
			if(array[i]==array[n] || Math.abs(n-i)==Math.abs(array[n]-array[i])) {
				return false;
			}
		}
		return true;
	}
//编写一个方法放置第n个皇后
	private void check(int n) {
		if(n==max) {//递归出口:说明已经放完了
			show();
			return;
		}
		//依次放入
		for(int i=0;i<max;i++) {
			//先把当前这个 也就是第n个皇后 放到该行的第1列
			array[n] = i;
			//判断放置第n个到i列是 是否冲突
			if(judge(n)) {
				check(n+1);
			}
			//如果冲突则继续执行 array[n] = i 此时i增加了1
		}
	}

建立for循环依次放入皇后,最大值是8,i从0到7,首先把当前这个皇后放在当前行的第i个,然后判断是否冲突,如果不冲突就放下一个,如果冲突则继续循环,该皇后放到下一列试试行不行。

3.感想

递归能看懂实际上不是很难,结合jvm对栈帧的理解就能明白每次调用自身的情况,栈中的栈帧是依次从上到下返回的;但是自己写出来就很难,哎。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构与算法是计算机科学中非常重要的概念。在Java中,有许多常见的数据结构和算法的实现。其中,数据结构包括数组、链表、栈、队列、跳表、散列表、二叉树、堆、图和Trie树。而算法包括递归、排序、二分查找、哈希算法和字符串匹配算法。\[1\] 在Java中,我们可以使用散列表(哈希表)来实现数据结构。而在字符串匹配算法中,有四种常见的算法:暴力匹配算法(BF算法)、RK算法、BM算法和KMP算法。这些算法都有各自的特点和适用场景。\[2\] 另外,在Java开发中,排序是一种常见的需求。我们可以使用一些常见的排序算法来对数据元素进行排序,比如按照日期对订单进行排序,按照价格对商品进行排序等等。在Java的开发工具包(JDK)中,已经提供了许多数据结构和算法的实现,比如List、Set、Map和Math等。我们可以借鉴JDK的方式,将算法封装到某个类中,并进行API的设计和实现。\[3\] 综上所述,数据结构与算法在Java中有着广泛的应用,通过学习和使用这些概念和实现,我们可以更好地解决问题和优化程序。 #### 引用[.reference_title] - *1* *2* [Java数据结构和算法学习笔记](https://blog.csdn.net/zth13015409853/article/details/121946203)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据结构与算法(Java篇)笔记--Comparable接口](https://blog.csdn.net/csh1807266489/article/details/126782378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值