最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年08月26日 09:25:56   作者:森森子_  
遞歸就是一個過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個大型復(fù)雜的問題層層轉(zhuǎn)化為一個與原問題相似的規(guī)模較小的問題來求解,需要的朋友可以參考下

在這里插入圖片描述

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

在這里插入圖片描述

到這,如果上面的你都理解了,那么我相信你可以用遞歸寫出 計算 n 的階乘的程序了,什么,寫不出,沒有關(guā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);
        }
    }
}

接下來就可以玩起來了,一個有趣的迷宮問題,假設(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ī)定墻和可以走的,只需要通過遍歷指定行和列,再把兩個特別的單獨強調(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;

實現(xiàn)效果:

在這里插入圖片描述

核心

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

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

  • 首先,創(chuàng)建一個類,寫findWay方法,返回值是boolean,三個參數(shù),分別是地圖,二維坐標(biāo)x,y用來確定位置
  • 接著,我們判斷如果map[6][5] == 2,就認(rèn)為小老鼠找到出口了,這點很重要,它是遞歸回調(diào)條件
  • 如果map[6][5] == 2條件為假,說明小老鼠沒有找到出口,調(diào)用方法時初始化開始坐標(biāo),接著map[i][j] = 2;假設(shè)可以走通就把坐標(biāo)的值修改為2,表示老鼠走的痕跡
  • 接下來,奇妙的事情發(fā)生了,遞歸就在這里開始了,我們調(diào)用自己findWay傳入?yún)?shù),我們先確定下來小老鼠的行走軌跡,假設(shè)是下-右-上-左,我們通過修改數(shù)組下標(biāo)來表示小老鼠的移動,假設(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();
        }

運行代碼查看結(jié)果:

在這里插入圖片描述

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

在這里插入圖片描述

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

完整代碼

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)文章

  • Java基本數(shù)據(jù)類型與類型轉(zhuǎn)換實例分析

    Java基本數(shù)據(jù)類型與類型轉(zhuǎn)換實例分析

    這篇文章主要介紹了Java基本數(shù)據(jù)類型與類型轉(zhuǎn)換,結(jié)合實例形式分析了Java基本數(shù)據(jù)類型分類、用法,類型轉(zhuǎn)換及相關(guān)操作注意事項,需要的朋友可以參考下
    2020-04-04
  • 解決springcloud Zuul丟失Cookie的問題

    解決springcloud Zuul丟失Cookie的問題

    這篇文章主要介紹了解決springcloud Zuul丟失Cookie的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Spring Boot 微信小程序接入微信支付功能

    Spring Boot 微信小程序接入微信支付功能

    本文詳細(xì)介紹了使用SpringBoot框架接入微信支付的全流程,包括導(dǎo)入依賴、配置微信公眾號信息、設(shè)置配置文件、編寫支付相關(guān)實體類和API地址常量、實現(xiàn)支付服務(wù)以及Controller層的編寫,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 基于JavaBean編輯器讀取peroperties文件的實例

    基于JavaBean編輯器讀取peroperties文件的實例

    下面小編就為大家?guī)硪黄贘avaBean編輯器讀取peroperties文件的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • java從mysql導(dǎo)出數(shù)據(jù)的具體實例

    java從mysql導(dǎo)出數(shù)據(jù)的具體實例

    這篇文章主要介紹了java從mysql導(dǎo)出數(shù)據(jù)的具體實例,有需要的朋友可以參考一下
    2013-12-12
  • slf4j與jul、log4j1、log4j2、logback的集成原理

    slf4j與jul、log4j1、log4j2、logback的集成原理

    這篇文章主要介紹了slf4j與jul、log4j1、log4j2、logback的集成原理,以及通用日志框架與具體日志實現(xiàn)系統(tǒng)的機制機制介紹,包括依賴的jar包,jar沖突處理等
    2022-03-03
  • redis scan命令導(dǎo)致redis連接耗盡,線程上鎖的解決

    redis scan命令導(dǎo)致redis連接耗盡,線程上鎖的解決

    這篇文章主要介紹了redis scan命令導(dǎo)致redis連接耗盡,線程上鎖的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • springboot+quartz以持久化的方式實現(xiàn)定時任務(wù)的代碼

    springboot+quartz以持久化的方式實現(xiàn)定時任務(wù)的代碼

    這篇文章主要介紹了springboot+quartz以持久化的方式實現(xiàn)定時任務(wù)的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • @ConfigurationProperties遇到的坑及解決

    @ConfigurationProperties遇到的坑及解決

    這篇文章主要介紹了解決@ConfigurationProperties遇到的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • mybatis中Oracle參數(shù)為NULL錯誤問題及解決

    mybatis中Oracle參數(shù)為NULL錯誤問題及解決

    這篇文章主要介紹了mybatis中Oracle參數(shù)為NULL錯誤問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

巫溪县| 客服| 余江县| 东辽县| 霍林郭勒市| 康乐县| 秀山| 梓潼县| 确山县| 潜山县| 辽源市| 方城县| 宁夏| 瓮安县| 庆元县| 华容县| 师宗县| 健康| 镇远县| 呈贡县| 威信县| 襄垣县| 岱山县| 阳泉市| 梅州市| 定兴县| 阳江市| 开阳县| 广西| 栾川县| 临夏市| 长垣县| 鱼台县| 凤翔县| 城市| 海伦市| 宁化县| 广安市| 云浮市| 平邑县| 盐亭县|