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

Java中的什么場景使用遞歸,如何使用遞歸

 更新時(shí)間:2021年09月03日 11:54:27   作者:怪咖軟妹@  
這篇文章主要介紹了Java中的什么場景使用遞歸,如何使用遞歸的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

什么是遞歸?

程序調(diào)用自身的編程技巧叫做遞歸。

遞歸有什么優(yōu)點(diǎn)?

遞歸算法:代碼簡潔、清晰,并且容易驗(yàn)證正確性。在一定的程度上還能幫我們減少很多重復(fù)代碼。

迭代和遞歸的區(qū)別

迭代是逐漸逼近,用新值覆蓋舊值,直到滿足條件后結(jié)束,不保存中間值,空間利用率高。

遞歸是將一個(gè)問題分解為若干相對小一點(diǎn)的問題,遇到遞歸出口再原路返回,因此必須保存相關(guān)的中間值,這些中間值壓入棧保存,問題規(guī)模較大時(shí)會(huì)占用大量內(nèi)存。

遞歸的三個(gè)條件

  • 邊界條件
  • 遞歸前進(jìn)段
  • 遞歸返回段

當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。

什么場景下適合使用遞歸

場景一

項(xiàng)目當(dāng)中菜單很多都是配置的,并且菜單有時(shí)候都是分好幾級的,當(dāng)我給他配置最下級的時(shí)候,那么我還得把他的上級保存起來才能用,但是我們又不確定他有幾個(gè)上級,這個(gè)時(shí)候可以采用遞歸調(diào)用。

public void packageParent(Set<String> parentIdSet) {
 Set<String> parentIdSet1 = new HashSet<>();
 for (String parentId : parentIdSet) {
  MenuOrg menuOrg = new MenuOrg();
  Menu menu = menuRepository.findOne(parentId);
  if (menu == null) {
   continue;
  }
  menuOrg.setMenuId(menu.getMenuId());
  menuOrg.setProType(menu.getProType());
  menuOrgRepository.save(menuOrg);
  if (menu.getParentId() != null) {
   parentIdSet1.add(menu.getParentId());
  }
 }
 //判斷parentIdSet1是否為空
 if(!CommonUtils.isCollectionBlankOrEmpty(parentIdSet1)) {
  packageParent(parentIdSet1);
 }
}

場景二

計(jì)算5的階乘

public class Test {
 public static void main(String[] args) {
  System.out.println(f(5));  
 } 
 public static int f(int n) {  
  if (1 == n)   
            return 1;  
        else  
            return n * f(n-1);  
    }  
}

此題中,按照遞歸的三個(gè)條件來分析:

(1)邊界條件:階乘,乘到最后一個(gè)數(shù),即1的時(shí)候,返回1,程序執(zhí)行到底;

(2)遞歸前進(jìn)段:當(dāng)前的參數(shù)不等于1的時(shí)候,繼續(xù)調(diào)用自身;

(3)遞歸返回段:從最大的數(shù)開始乘,如果當(dāng)前參數(shù)是5,那么就是54,即5(5-1),即n*(n-1)

總結(jié)

遞歸中一定有迭代,但是迭代中不一定有遞歸,大部分可以相互轉(zhuǎn)換。

能用迭代的不用遞歸,遞歸調(diào)用函數(shù),計(jì)算有重復(fù),浪費(fèi)空間,并且遞歸太深容易造成堆棧的溢出。

Java 遞歸算法

一、概述

Java遞歸:簡單說就是函數(shù)自身直接或間接調(diào)用函數(shù)的本身。

二、應(yīng)用場景

若:一個(gè)功能在被重復(fù)使用,并每次使用時(shí),參與運(yùn)算的結(jié)果和上一次調(diào)用有關(guān),這時(shí)就可以使用遞歸來解決這個(gè)問題。

使用要點(diǎn):

1,遞歸一定明確條件。否則容易棧溢出。

2,注意一下遞歸的次數(shù)。

三、示例

最簡單的遞歸演示

public class recursionDemo {  
    public static void main(String[] args) {
        show();
    }
    private static void show() {
        method();
    }
    private static void method() {
        show();
    } 
}

四、實(shí)際示例

我們都知道 6的二進(jìn)制是110,那么程序是怎么執(zhí)行的呢?

代碼示例:

 public static void main(String[] args) {
        toBin(6);
    } 
    private static void toBin(int num) {
        if (num>0){
            //取余
            System.out.println(num%2);
            toBin(num/2);
        }
    }

運(yùn)行過程:

遞歸演示二:計(jì)算1-5,求和

public static void main(String[] args) {
        //1-5求和
        int sum = getSum(5);
        System.out.println(sum);
    } 
    private static int getSum(int num) {
        int x=9;
        if (num==1){
            return 1;
        } 
        return  num+getSum(num-1);
    }

程序運(yùn)行圖:

五、遞歸的缺點(diǎn)

在使用遞歸時(shí),一定要考慮遞歸的次數(shù),負(fù)責(zé)很容易造成虛擬機(jī) “棧溢出”。

仍然使用上面的求和代碼,只是這次將求和基數(shù)變?yōu)?90000000,看看結(jié)果如何

public static void main(String[] args) {
        //1-90000000求和
        int sum = getSum(90000000);
        System.out.println(sum);
    }
 
    private static int getSum(int num) {
        int x=9;
        if (num==1){
            return 1;
        } 
        return  num+getSum(num-1);
    }

果然就造成了虛擬機(jī)棧溢出。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java基于棧方式解決漢諾塔問題實(shí)例【遞歸與非遞歸算法】

    Java基于棧方式解決漢諾塔問題實(shí)例【遞歸與非遞歸算法】

    這篇文章主要介紹了Java基于棧方式解決漢諾塔問題的方法,結(jié)合實(shí)例形式分析了java棧方式采用遞歸與非遞歸算法解決漢諾塔問題的相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能過程詳解

    Spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能過程詳解

    這篇文章主要介紹了Spring security實(shí)現(xiàn)記住我下次自動(dòng)登錄功能過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring注解之@Lazy注解使用解析

    Spring注解之@Lazy注解使用解析

    這篇文章主要介紹了Spring注解之@Lazy注解使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Spring注解@Configuration和@Component區(qū)別詳解

    Spring注解@Configuration和@Component區(qū)別詳解

    @Component和@Configuration都可以作為配置類,之前一直都沒覺得這兩個(gè)用起來有什么差別,可能有時(shí)程序跑的和自己想的有所區(qū)別也沒注意到,下面這篇文章主要給大家介紹了關(guān)于Spring注解@Configuration和@Component區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作

    MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作

    這篇文章主要介紹了MyBatis 實(shí)現(xiàn)數(shù)據(jù)的批量新增和刪除的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Feign?日期格式轉(zhuǎn)換錯(cuò)誤的問題

    Feign?日期格式轉(zhuǎn)換錯(cuò)誤的問題

    這篇文章主要介紹了Feign?日期格式轉(zhuǎn)換錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java后臺(tái)發(fā)起get請求獲取響應(yīng)數(shù)據(jù)

    java后臺(tái)發(fā)起get請求獲取響應(yīng)數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了java后臺(tái)發(fā)起get請求獲取響應(yīng)數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java之SpringCloud Eurka注冊錯(cuò)誤解決方案

    Java之SpringCloud Eurka注冊錯(cuò)誤解決方案

    這篇文章主要介紹了Java之SpringCloud Eurka注冊錯(cuò)誤解決方案,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Spring?Cloud?Gateway?整合?knife4j?聚合接口文檔功能

    Spring?Cloud?Gateway?整合?knife4j?聚合接口文檔功能

    這篇文章主要介紹了Spring?Cloud?Gateway?整合?knife4j?聚合接口文檔的相關(guān)知識(shí),我們可以基于?Spring?Cloud?Gateway?網(wǎng)關(guān)?+?nacos?+?knife4j?對所有微服務(wù)項(xiàng)目的接口文檔進(jìn)行聚合,從而實(shí)現(xiàn)我們想要的文檔管理功能,需要的朋友可以參考下
    2022-02-02
  • Java中讀取文件轉(zhuǎn)換為字符串的方法

    Java中讀取文件轉(zhuǎn)換為字符串的方法

    今天小編就為大家分享一篇Java中讀取文件轉(zhuǎn)換為字符串的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評論

保定市| 常山县| 康保县| 略阳县| 白水县| 新建县| 玉林市| 于田县| 承德县| 武陟县| 德格县| 荔浦县| 固安县| 平遥县| 乌审旗| 布尔津县| 巴东县| 赤水市| 精河县| 五家渠市| 青田县| 荆州市| 尤溪县| 英吉沙县| 聂荣县| 怀集县| 阳谷县| 乌兰浩特市| 万全县| 忻城县| 克山县| 工布江达县| 汉中市| 南汇区| 常宁市| 嵊州市| 浦北县| 台湾省| 湖州市| 竹山县| 武汉市|