91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java如何實現遞歸尋路

發布時間:2021-08-26 11:50:55 來源:億速云 閱讀:173 作者:小新 欄目:開發技術

小編給大家分享一下Java如何實現遞歸尋路,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Java如何實現遞歸尋路

看懂這張圖,方法調用方法,棧開新棧,遞歸尾結束要回到main棧,必須一級一級返回,每一次返回都是調用整個方法,調用完成棧被釋放,直至回到棧底main遞歸結束并能夠自己畫出來,理解遞歸的運行機制,這是我手畫的,不好看,你的呢,還不動起來

Java如何實現遞歸尋路

到這,如果上面的你都理解了,那么我相信你可以用遞歸寫出 計算 n 的階乘的程序了,什么,寫不出,沒有關系,我來補上,一定要理解在棧里運行機制

使用遞歸計算階乘

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);
        }
    }
}

接下來就可以玩起來了,一個有趣的迷宮問題,假設有如下二維數組表示地圖,數字1表示圍墻,數字0表示可以走,現在有只小老鼠被困在下標為[1][1]的位置,出口在下標為[6][5]的位置,思考:使用遞歸如何讓小老鼠尋路逃生呢?

Java如何實現遞歸尋路

思考過后,腦袋是不是蒙蒙的

想要玩起來

地圖創建

思路

1. 先創建迷宮,用二維數組表示 int[][] map = new int[8][7];
2. 規定 map:0 表示可以走,1表示墻不能走

1,打印二維數組

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();
        }
    }
}

Java如何實現遞歸尋路

2,規定墻和可以走的,只需要通過遍歷指定行和列,再把兩個特別的單獨強調,完成

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;

實現效果:

Java如何實現遞歸尋路

核心

這時就完成了地圖,思考如何使用遞歸尋路呢

開始吧,寫一個方法,通過遞歸來實現尋路,我直接放代碼了

  • 首先,創建一個類,寫findWay方法,返回值是boolean,三個參數,分別是地圖,二維坐標x,y用來確定位置

  • 接著,我們判斷如果map[6][5] == 2,就認為小老鼠找到出口了,這點很重要,它是遞歸回調條件

  • 如果map[6][5] == 2條件為假,說明小老鼠沒有找到出口,調用方法時初始化開始坐標,接著map[i][j] = 2;假設可以走通就把坐標的值修改為2,表示老鼠走的痕跡

  • 接下來,奇妙的事情發生了,遞歸就在這里開始了,我們調用自己findWay傳入參數,我們先確定下來小老鼠的行走軌跡,假設是下-右-上-左,我們通過修改數組下標來表示小老鼠的移動,假設上下左右都沒能走通,就把坐標值修改為3,表示小老鼠被困死了,返回false,失敗,?,代碼已經完成

  • 小伙伴:什么???完成了???

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;
           }
       }
    }
}

主函數調用,查看結果:

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();
        }

運行代碼查看結果:

Java如何實現遞歸尋路

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

Java如何實現遞歸尋路

一定要理解透,你也可以設置死路,只要上面的理解了,達到能在腦子里快速回放遞歸的過程,棧開棧,棧銷毀,等等,你就可以隨便玩了,之前是不是一直不理解為什么說遞歸占用空間,謹慎使用,這下就明明白白了,好了,多理解理解,這就是所有內容,感受到遞歸的魅力了嗎?哈哈 是不是很好玩,體會這種思想,感謝觀看

完整代碼

public class miGong {
    public static void main(String[] args) {
        //思路
        //1.先創建迷宮,用二維數組表示 int[][] map = new int[8][7];
        //2.規定 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;
           }
       }
    }
}

以上是“Java如何實現遞歸尋路”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉龙| 电白县| 通许县| 屏山县| 宝兴县| 壤塘县| 湖南省| 滁州市| 兴化市| 含山县| 普兰县| 新郑市| 尖扎县| 浦东新区| 会宁县| 西华县| 集贤县| 云安县| 五台县| 荣成市| 天水市| 朝阳区| 巢湖市| 凤城市| 兰西县| 彩票| 龙井市| 桓台县| 获嘉县| 汶上县| 滨州市| 静安区| 满城县| 亚东县| 伊川县| 上虞市| 鹿泉市| 洛浦县| 临清市| 天气| 全椒县|