遞歸算法的一些簡單的實例


  確實花錢訂閱了一下數據結構與算法的專欄,這里沒有把專欄里面的內容寫到博客上,我很注重人家的勞動成果的,所以我只把我寫的,或者是網上找的一些算法的實例在這里貼出來,方便自己以后的學習,以及對自己的對一些比較常見的算法的理解有所幫助!

  在公司的時候,空閑的時間寫的遞歸算法的一些實例,我也測試過了,可以運行的!

 1   /***
 2      * 遞歸求和  1+2+3+...+n
 3      * @param n 輸入的數值
 4      * @return
 5      */
 6     public static int recursionSum(int n){
 7         
 8         if(n>0){
 9             return n + recursionSum(n);
10         }else{
11             return 0;
12         }
13     }
14     
15     /***
16      * 遞歸階乘  n! = n*(n-1)*(n-2)*...*1
17      * @param n 需要求取階乘的數值
18      * @return
19      */
20     public static int recursionMulity(int n){
21         
22         if(n == 1){
23             return 1;
24         }
25         return n * recursionMulity(n-1);
26     }
27     
28     /***
29      * 題意:一個人趕着鴨子去每個村庄賣,每經過一個村子賣去所趕鴨子的一半又一只。
30      * 這樣他經過了七個村子后還剩兩只鴨子,問他出發時共趕多少只鴨子?經過每個村子賣出多少只鴨子?
31      * 
32      * 分析:第七天后該人只有2只鴨子,記每天的鴨子數量為num,則之前每天的鴨子總數為當天后一天的(num+1)*2只,當天賣掉的鴨子個數為(num/2)+1只
33      * 
34      * 算法步驟:
35      * 1) 令num等於2,n等於7;
36      * 2) 計算前一天的總鴨子數量num = (num + 1) * 2;
37      * 3) 計算並輸出第n天賣掉的鴨子數量;
38      * 4) 將n減去1,判斷n是否大於0,若是,則輸出總鴨子數量num,否則,遞歸調用函數繼續進行計算。
39      *
40      * @param num 最后一天剩余的鴨子的數量
41      * @param counter 村庄的個數
42      * @return 計算出的sum的和
43      */
44     public static int duck_sale(int num, int counter){
45         
46         num = (num + 1) * 2;
47         System.out.println("第"+counter+"個村子賣出的鴨子的數量是:>>>>>>"+(num/2-1));
48         //計數器減1
49         counter--;
50         
51         if(counter > 0){
52             //說明前面鴨子沒賣完  遞歸調用方法 算出該村子賣出的鴨子的數量
53             duck_sale(num,counter);
54         }else{
55             //說明鴨子賣完了
56             System.out.println("鴨子的總數是:>>>>>>"+num);
57         }
58         return num;
59     }
60     /***
61      * 角谷定理。輸入一個自然數,若為偶數,則把它除以2,若為奇數,則把它乘以3加1。經過如此有限次運算后,總可以得到自然數值1。
62      * 求經過多少次可得到自然數1。
63      * 如:輸入22,
64      * 輸出 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 
65      * STEP=16
66      * 
67      * 算法步驟:
68      * 1)定義計數器counter=0 輸入自然數的值
69      * 2)判斷n 是否為偶數,若是,則n=n/2 若不是,則n=n*3+1
70      * 3)判斷n是否等於1 若是,則輸出counter,若不是繼續 調用jiaogu()
71      * 
72      * @param n 輸入的自然數 所要求的數值
73      * @return 輸出最后結果所需要的調用幾次
74      */
75     public static int jiaogu(int n, int counter){
76         
77         //這個計數器不可以在這里賦值的,這樣每一次調用方法進來之后,都會重置counter的值
78         //int counter = 1;
79 
80         if(n == 1){
81             System.out.println("Step is >>>>>>"+counter);
82         }else{
83             //計數器+1
84             counter++;
85             if(n % 2 == 0){
86                 n = n / 2;
87             }else{
88                 n = n * 3 + 1;
89             }
90             
91             System.out.println("輸出當前自然數的值是:>>>>>>"+n);
92             //遞歸調用
93             jiaogu(n,counter);
94         }
95         return counter;
96     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM