一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中的什么場景使用遞歸,如何使用遞歸

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

2021-12-18 14:27怪咖軟妹@ Java教程

這篇文章主要介紹了Java中的什么場景使用遞歸,如何使用遞歸的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

什么是遞歸?

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

 

遞歸有什么優點?

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

 

迭代和遞歸的區別

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

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

 

遞歸的三個條件

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

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

 

什么場景下適合使用遞歸

場景一

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

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)邊界條件:階乘,乘到最后一個數,即1的時候,返回1,程序執行到底;

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

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

總結

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

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

 

Java 遞歸算法

一、概述

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

二、應用場景

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

使用要點:

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

2,注意一下遞歸的次數。

三、示例

最簡單的遞歸演示

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

四、實際示例

我們都知道 6的二進制是110,那么程序是怎么執行的呢?

代碼示例:

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

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

運行過程:

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

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

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

程序運行圖:

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

五、遞歸的缺點

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

仍然使用上面的求和代碼,只是這次將求和基數變為 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中的什么場景使用遞歸,如何使用遞歸

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

原文鏈接:https://blog.csdn.net/weixin_43888891/article/details/109092850

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
主站蜘蛛池模板: 亚洲精品在线播放 | 99久久99热久久精品免费看 | 女子监狱第二季在线观看免费完整版 | 亚洲干综合| 美女操批| 51国产午夜精品免费视频 | 亚洲 欧美 制服 校园 动漫 | 亚洲26uuuu最新地址 | 奶大逼紧 | 国产在线视频第一页 | xxxxxx日本处大片免费看 | 国产香蕉一区二区在线观看 | 欧美一级视频在线 | 美女日b视频 | 人人人人看人人人做人人 | avtt天堂网手机版亚洲 | 无套日出白浆在线播放 | 日本福利网 | 操女b | 国产高清在线精品一区二区 | 国产精品久久久久久影视 | 69堂最新地域网名 | 久久精品国产欧美日韩99热 | 99热这里有免费国产精品 | 91制片厂制作果冻传媒八夷 | 激情亚洲天堂 | 色综七七久久成人影 | 青涩体验在线观看未删减 | 国产成人成人一区二区 | 92国产福利久久青青草原 | 香港日本三级亚洲三级 | 我的男友是消防员在线观看 | 国产激情在线 | 精品国产欧美一区二区五十路 | 欧美高清在线不卡免费观看 | 日韩大片免费观看 | 欧美另类xxx精品人妖 | 岛国片免费观看 | 精品国产线拍大陆久久尤物 | 欧美x×x | oneday高清在线观看 |