欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

什么是遞歸?

程序調用自身的編程技巧叫做遞歸。

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

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

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

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

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

遞歸的三個條件

  • 邊界條件
  • 遞歸前進段
  • 遞歸返回段

當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。

什么場景下適合使用遞歸

場景一

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

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

場景二

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

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

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

(2)遞歸前進段:當前的參數(shù)不等于1的時候,繼續(xù)調用自身;

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

總結

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

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

Java 遞歸算法

一、概述

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

二、應用場景

若:一個功能在被重復使用,并每次使用時,參與運算的結果和上一次調用有關,這時就可以使用遞歸來解決這個問題。

使用要點:

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

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

三、示例

最簡單的遞歸演示

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

四、實際示例

我們都知道 6的二進制是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);
        }
    }

運行過程:

遞歸演示二:計算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);
    }

程序運行圖:

五、遞歸的缺點

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

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

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

果然就造成了虛擬機棧溢出。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java中的動態(tài)代理實現(xiàn)代碼實例

    Java中的動態(tài)代理實現(xiàn)代碼實例

    這篇文章主要介紹了Java中的動態(tài)代理實現(xiàn)代碼實例,jdk動態(tài)代理本質上是使用被代理對象的類加載器,通過被代理類實現(xiàn)的接口在運行時動態(tài)構造出代理類來增強原始類的功能的方法,需要的朋友可以參考下
    2023-12-12
  • RocketMQ生產者調用start發(fā)送消息原理示例

    RocketMQ生產者調用start發(fā)送消息原理示例

    這篇文章主要為大家介紹了RocketMQ生產者調用start發(fā)送消息原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java ThreadLocal的詳細解釋

    Java ThreadLocal的詳細解釋

    這篇文章主要介紹了快速了解Java中ThreadLocal類,介紹了ThreadLocal 是什么,ThreadLocal的作用,ThreadLocal 原理等相關內容,具有一定參考價值,需要的朋友可以了解下。
    2021-11-11
  • 開發(fā)工具EesyCode使用方法解析

    開發(fā)工具EesyCode使用方法解析

    這篇文章主要介紹了開發(fā)工具EesyCode使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Spring?Boot中的@EnableAutoConfiguration注解詳解

    Spring?Boot中的@EnableAutoConfiguration注解詳解

    這篇文章主要介紹了Spring?Boot中的@EnableAutoConfiguration注解詳解,Spring?Boot是一個非常流行的Java框架,它可以快速創(chuàng)建基于Spring的應用程序。Spring?Boot提供了許多自動配置功能,使得開發(fā)者可以非常容易地創(chuàng)建一個可運行的應用程序,需要的朋友可以參考下
    2023-08-08
  • Springboot整合SpringSecurity的完整案例詳解

    Springboot整合SpringSecurity的完整案例詳解

    Spring Security是基于Spring生態(tài)圈的,用于提供安全訪問控制解決方案的框架,Spring Security登錄認證主要涉及兩個重要的接口 UserDetailService和UserDetails接口,本文對Springboot整合SpringSecurity過程給大家介紹的非常詳細,需要的朋友參考下吧
    2024-01-01
  • 用Java實現(xiàn)希爾排序的示例

    用Java實現(xiàn)希爾排序的示例

    問題:現(xiàn)有一段程序S,可以對任意n個數(shù)進行排序。如果現(xiàn)在需要對n^2個數(shù)進行排序,最少需要調用S多少次?只允許調用S,不可以做別的操作。我們用希爾排序來做解決這個
    2013-11-11
  • Java8 Lamdba函數(shù)式推導

    Java8 Lamdba函數(shù)式推導

    這篇文章主要介紹了Java8 Lamdba函數(shù)式推導,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java數(shù)據(jù)結構之圖的兩種搜索算法詳解

    Java數(shù)據(jù)結構之圖的兩種搜索算法詳解

    在很多情況下,我們需要遍歷圖,得到圖的一些性質。有關圖的搜索,最經典的算法有深度優(yōu)先搜索和廣度優(yōu)先搜索,接下來我們分別講解這兩種搜索算法,需要的可以參考一下
    2022-11-11
  • 基于hashmap 的擴容和樹形化全面分析

    基于hashmap 的擴容和樹形化全面分析

    這篇文章主要介紹了hashmap 的擴容和樹形化的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論