日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

[Java]方法递归——经典案例

發布時間:2023/12/10 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Java]方法递归——经典案例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java中的方法遞歸

  • 方法遞歸
    遞歸是一種算法,在程序設計語言中廣泛應用。
    方法調用自身的形式稱為方法遞歸(recursion)。

  • 遞歸的形式
    直接遞歸:方法自己調用自己。
    間接遞歸:方法調用其他方法,其他方法又回調方法自己。

  • 方法遞歸注意事項
    遞歸如果沒有控制好終止,會出現遞歸死循環,導致棧內存溢出現象。

  • 遞歸算法三要素
    遞歸的公式
    遞歸的終結點
    遞歸的方向必須走向終結點

通過一些經典案例,加深對方法遞歸的思想。

文章目錄

  • Java中的方法遞歸
    • 一、有規律的遞歸
        • 1.求1-n的和
        • 2.猴子吃桃問題
    • 二、無規律的遞歸
        • 啤酒問題
    • 三、遞歸擴展應用
        • 文件搜索

一、有規律的遞歸

1.求1-n的和


分析:
此求和問題, 計算方法 f(n) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + …(n-1) + n,含有一定的規律,可總結為:

  • 遞歸公式: f(n) = f(n-1) + n
  • 遞歸終結點:f(1) = 1
  • 遞歸方向:走向終結點 f(1) 的方向
  • 如果求1-5的和 的結果,遞歸思想——先遞深,在歸回
  • public class Demo1 {public static void main(String[] args) {System.out.println("1-5的和為:"+sum(5));}//遞歸求和private static int sum(int n) {if ( n == 1){return 1;}else {return sum(n-1)+n;}} }

    運行結果:

    1-5的和為:15Process finished with exit code 0

    2.猴子吃桃問題


    分析:
    整體來看,每一天都是做同一個事件,典型的規律化問題,考慮遞歸三要素:

  • 遞歸公式: f(n+1) =1/2 f(n) - 1
    化簡可得 f(n) = 2f(n+1) + 2
  • 遞歸終結點: f(10)
  • 遞歸方向:走向終結點 f(10) 的方向
  • public class Demo2 {public static void main(String[] args) {System.out.println("一共有"+fun1(1)+"個桃子");}//計算桃子數量private static int fun1(int n) {if (n == 10){return 1;}else {return fun1(n+1)*2+2;}} }

    運行結果

    一共有1534個桃子Process finished with exit code 0

    二、無規律的遞歸

    啤酒問題


    分析:
    啤酒問題,并不是有規律的計算問題。但是,喝完之后的空瓶、蓋子又可以換啤酒,變相來看,又是有規律的計算問題。
    解決此類問題,可以將空瓶、蓋子轉換為金錢問題,轉換思想,就是花錢買酒,將復雜的貨物交換,轉換為簡單統一的金錢交換問題,易于解題。

    public class Demo3 {//定義靜態成員變量進行統計最后買的啤酒,默認為0public static int totalNumber; //記錄買的啤酒public static int totalButtle; //記錄上次剩余的瓶子個數public static int totalCover; //記錄上次剩余的蓋子個數public static void main(String[] args) {buy(10);}/*** 進行買啤酒* @param money*/private static void buy(int money) {int buyNumber = money/2;totalNumber += buyNumber;//記錄當前的瓶子個數、蓋子個數int buttle = totalButtle + buyNumber;int cover = totalCover + buyNumber;//將當前的瓶子和蓋子轉換為金錢,利用遞歸再次購買啤酒int allMoney = 0;//先判斷瓶子和蓋子的個數是否滿足可以兌換的數量,if (buttle >= 2){allMoney += (buttle/2) * 2;}if (cover >= 4){allMoney += (cover/4) * 2;}//并計算當前剩余的瓶子和蓋子的數量totalButtle = buttle % 2;totalCover = cover % 4;//進行判斷是否進行遞歸操作if (allMoney >= 2){buy(allMoney);}else {System.out.println(totalNumber+"瓶酒\t\t"+totalButtle+"個瓶子\t\t"+totalCover+"個蓋子");}} }

    運行結果:

    15瓶酒 1個瓶子 3個蓋子Process finished with exit code 0

    三、遞歸擴展應用

    文件搜索


    分析:
    在對指定文件進行搜索,當我們并不知道指定文件在哪里時,搜索該文件方案是打開當前磁盤,找到所有的文件進行查找;未找到,則從第一個文件夾,一個個打卡進行查找,沒有則退出,進入下一個文件,以此類推。

  • 先定位出的應該是一級文件對象
  • 遍歷全部一級文件對象,判斷是否是文件
  • 如果是文件,判斷是否是自己想要的
  • 如果是文件夾,需要繼續遞歸進去重復上述過程
  • /*** 進行查找磁盤中的一個指定文件的絕對路徑* E:\Java\快捷鍵.md*/ public class Demo4 {public static void main(String[] args) {//一個磁盤,一個文件名searchFile(new File("E:/"),"快捷鍵.md");}/*** 進行文件的查找,并輸出其文件的絕對路徑* @param dir 當前查找的目錄/文件夾* @param fileName 所要查找的文件名*/private static void searchFile(File dir, String fileName) {//進行判斷目錄是否為空 或者不是一個目錄if (dir != null && dir.isDirectory()){//獲取當前目錄下的一級文件File[] files = dir.listFiles();if (files != null && files.length > 0) {//進行對數組文件遍歷查找for (File file : files) {//判斷文件是否為文件夾,若為文件夾,則進行遞歸操作if (file.isFile()){if (file.getName().contains(fileName)) {System.out.println(fileName+"文件的絕對路徑為:"+file.getAbsolutePath());}}else {searchFile(file,fileName);}}}}else {System.out.println("該文件不是一個目錄,或者該目錄為空!!!!");}} }

    運行結果

    快捷鍵.md文件的絕對路徑為:E:\Java\快捷鍵.mdProcess finished with exit code 0

    注意:文件搜索中利用遞歸的技術,listFiles只能搜索到一級文件對象

    總結

    以上是生活随笔為你收集整理的[Java]方法递归——经典案例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。