Java遞歸尋路實(shí)現(xiàn),你真的理解了嗎
引

看懂這張圖,方法調(diào)用方法,棧開新棧,遞歸尾結(jié)束要回到main棧,必須一級(jí)一級(jí)返回,每一次返回都是調(diào)用整個(gè)方法,調(diào)用完成棧被釋放,直至回到棧底main遞歸結(jié)束并能夠自己畫出來,理解遞歸的運(yùn)行機(jī)制,這是我手畫的,不好看,你的呢,還不動(dòng)起來

到這,如果上面的你都理解了,那么我相信你可以用遞歸寫出 計(jì)算 n 的階乘的程序了,什么,寫不出,沒有關(guān)系,我來補(bǔ)上,一定要理解在棧里運(yùn)行機(jī)制
使用遞歸計(jì)算階乘
public class Factorial {
public static void main(String[] args) {
Factorial jie = new Factorial ();
System.out.println(jie.f(3));
}
public int f(int n){
if(n == 1){
return 1;
}else {
return n*f(n-1);
}
}
}
接下來就可以玩起來了,一個(gè)有趣的迷宮問題,假設(shè)有如下二維數(shù)組表示地圖,數(shù)字1表示圍墻,數(shù)字0表示可以走,現(xiàn)在有只小老鼠被困在下標(biāo)為[1][1]的位置,出口在下標(biāo)為[6][5]的位置,思考:使用遞歸如何讓小老鼠尋路逃生呢?

思考過后,腦袋是不是蒙蒙的
想要玩起來
地圖創(chuàng)建
思路
1. 先創(chuàng)建迷宮,用二維數(shù)組表示 int[][] map = new int[8][7];
2. 規(guī)定 map:0 表示可以走,1表示墻不能走
1,打印二維數(shù)組
public class miGong {
public static void main(String[] args) {
int[][] map = new int[8][7];
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
}

2,規(guī)定墻和可以走的,只需要通過遍歷指定行和列,再把兩個(gè)特別的單獨(dú)強(qiáng)調(diào),完成
for (int i = 0;i < 7;i++){
map[0][i] = 1;
map[7][i] = 1;
}
for (int i = 0;i < 8;i++){
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
實(shí)現(xiàn)效果:

核心
這時(shí)就完成了地圖,思考如何使用遞歸尋路呢
開始吧,寫一個(gè)方法,通過遞歸來實(shí)現(xiàn)尋路,我直接放代碼了
- 首先,創(chuàng)建一個(gè)類,寫findWay方法,返回值是boolean,三個(gè)參數(shù),分別是地圖,二維坐標(biāo)x,y用來確定位置
- 接著,我們判斷如果map[6][5] == 2,就認(rèn)為小老鼠找到出口了,這點(diǎn)很重要,它是遞歸回調(diào)條件
- 如果map[6][5] == 2條件為假,說明小老鼠沒有找到出口,調(diào)用方法時(shí)初始化開始坐標(biāo),接著map[i][j] = 2;假設(shè)可以走通就把坐標(biāo)的值修改為2,表示老鼠走的痕跡
- 接下來,奇妙的事情發(fā)生了,遞歸就在這里開始了,我們調(diào)用自己findWay傳入?yún)?shù),我們先確定下來小老鼠的行走軌跡,假設(shè)是下-右-上-左,我們通過修改數(shù)組下標(biāo)來表示小老鼠的移動(dòng),假設(shè)上下左右都沒能走通,就把坐標(biāo)值修改為3,表示小老鼠被困死了,返回false,失敗,🆗,代碼已經(jīng)完成
- 小伙伴:什么???完成了???
class way{
//使用遞歸回溯的思想來解決
public boolean findWay(int[][] map,int i,int j){
if(map[6][5] == 2){
return true;
}else{
if(map[i][j] == 0){
//假定可以走通
map[i][j] = 2;
//下-右-上-左
if(findWay(map,i+1,j)){//下
return true;
}else if(findWay(map,i,j+1)){//右
return true;
}else if(findWay(map,i-1,j)){//上
return true;
}else if(findWay(map,i,j-1)){//左
return true;
}else {
map[i][j] = 3;
return false;
}
}else {
return false;
}
}
}
}
主函數(shù)調(diào)用,查看結(jié)果:
way f = new way();
f.findWay(map,1,1);
System.out.println("=====找路=====");
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
運(yùn)行代碼查看結(jié)果:

看到成功尋路逃生~~~,是不是還很疑惑

一定要理解透,你也可以設(shè)置死路,只要上面的理解了,達(dá)到能在腦子里快速回放遞歸的過程,棧開棧,棧銷毀,等等,你就可以隨便玩了,之前是不是一直不理解為什么說遞歸占用空間,謹(jǐn)慎使用,這下就明明白白了,好了,多理解理解,這就是所有內(nèi)容,感受到遞歸的魅力了嗎?哈哈 是不是很好玩,體會(huì)這種思想,感謝觀看
完整代碼
public class miGong {
public static void main(String[] args) {
//思路
//1.先創(chuàng)建迷宮,用二維數(shù)組表示 int[][] map = new int[8][7];
//2.規(guī)定 map:0 表示可以走,1表示墻不能走
int[][] map = new int[8][7];
for (int i = 0;i < 7;i++){
map[0][i] = 1;
map[7][i] = 1;
}
for (int i = 0;i < 8;i++){
map[i][0] = 1;
map[i][6] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
//打印
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
way f = new way();
f.findWay(map,1,1);
System.out.println("=====找路=====");
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
}
class way{
//使用遞歸回溯的思想來解決
public boolean findWay(int[][] map,int i,int j){
if(map[6][5] == 2){
return true;
}else{
if(map[i][j] == 0){
//假定可以走通
map[i][j] = 2;
//下-右-上-左
if(findWay(map,i+1,j)){//下
return true;
}else if(findWay(map,i,j+1)){//右
return true;
}else if(findWay(map,i-1,j)){//上
return true;
}else if(findWay(map,i,j-1)){//左
return true;
}else {
map[i][j] = 3;
return false;
}
}else {
return false;
}
}
}
}
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
一文帶你快速學(xué)會(huì)JDBC及獲取連接的五種方式
JDBC(Java Database Connectivity)是一個(gè)獨(dú)立于特定數(shù)據(jù)庫(kù)管理系統(tǒng)、通用的SQL數(shù)據(jù)庫(kù)存取和操作的公共接口,下面這篇文章主要給大家介紹了關(guān)于如何通過一文帶你快速學(xué)會(huì)JDBC及獲取連接的五種方式,需要的朋友可以參考下2022-09-09
解決Java處理HTTP請(qǐng)求超時(shí)的問題
這篇文章主要介紹了解決Java處理HTTP請(qǐng)求超時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
使用Java程序模擬實(shí)現(xiàn)新冠病毒傳染效果
這篇文章主要介紹了用Java程序模擬實(shí)現(xiàn)新冠病毒傳染效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn)
這篇文章主要介紹了java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

