遞歸計數問題


該類問題兩大特征:return 遞歸方法+遞歸方法(+。。。)      出口處return 1

1.二維數組走路問題

小明參加了學校的趣味運動會,其中的一個項目是:跳格子。
地上畫着一些格子,每個格子里寫一個字,如下所示:(也可參見下圖)

從我做起振
我做起振興
做起振興中
起振興中華

比賽時,先站在左上角的寫着“從”字的格子里,可以橫向或縱向跳到相鄰的格子里,但不能跳到對角的格子或其它位置。一直要跳到“華”字結束。

要求跳過的路線剛好構成“從我做起振興中華”這句話。
請你幫助小明算一算他一共有多少種可能的跳躍路線呢?

 1 import java.util.Scanner;  2 
 3 public class Main {  4 
 5     public static int digui(int x, int y) {  6         if(x==3||y==4)  7             return 1;//因為只要到達邊界就只有一條路可走
 8         return digui(x+1,y)+digui(x,y+1);  9  } 10 
11     public static void main(String[] args) { 12         Scanner sc = new Scanner(System.in); 13         System.out.println(digui(0, 0)); 14  } 15 
16 }

 

2.甲殼蟲車隊

X星球特別講究秩序,所有道路都是單行線。
一個甲殼蟲車隊,共16輛車,按照編號先后發車,夾在其它車流中,緩緩前行。

路邊有個死胡同,只能容一輛車通過,是臨時的檢查站,如圖所示。
X星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。
如果車輛進入檢查站和離開的次序可以任意交錯。那么,該車隊再次上路后,可能的次序有多少種?

為了方便起見,假設檢查站可容納任意數量的汽車。
顯然,如果車隊只有1輛車,可能次序1種;2輛車可能次序2種;3輛車可能次序5種。

 1 public class Main {  2 
 3     //x:想要進棧的車  4     //y:已經進棧的車
 5     
 6     public static int digui(int x, int y) {  7         if(x==0)  8             return 1;//走完了,只能讓棧里的車往外出,只有一種情況
 9         if(y==0) 10             return digui(x-1,1);//棧中沒車的時候,從左邊選一輛車進棧(當然前提是x!=0)
11         return digui(x-1,y+1)+digui(x,y-1);//分兩種情況走,1是左邊的車輛進棧,2是棧里的車輛出棧
12  } 13 
14     public static void main(String[] args) { 15         System.out.println(digui(16, 0)); 16  } 17 
18 }

 

3.39級台階問題

小明剛剛看完電影《第39級台階》。離開電影院的時候,他數了數禮堂前的台階數,恰好是39級!
站在台階前,他突然又想着一個問題:
如果我每一步只能邁上1個或2個台階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數步。那么,上完39級台階,有多少種不同的上法呢?
請你利用計算機的優勢,幫助小明尋找答案。

//類似於甲殼蟲車隊問題,分一步兩步兩種情況走,並用參數統計次數
public class Main { public static int digui(int n, int c) { if (n <= 0) { if (n == 0 && c % 2 == 0) return 1; else
                return 0; } return digui(n - 1, c + 1) + digui(n - 2, c + 1); } public static void main(String[] args) { System.out.println(digui(39, 0)); } }

 

4.排隊找錢-領鞋問題

公園票價為5角。假設每位游客只持有兩種幣值的貨幣:5角、1元。
再假設持有5角的有m人,持有1元的有n人。 由於特殊情況,開始的時候,售票員沒有零錢可找。 我們想知道這m+n名游客以什么樣的順序購票則可以順利完成購票過程。 顯然,m < n的時候,無論如何都不能完成; m>=n的時候,有些情況也不行。比如,第一個購票的乘客就持有1元。 請計算出這m+n名游客所有可能順利完成購票的不同情況的組合數目。 注意:只關心5角和1元交替出現的次序的不同排列,持有同樣幣值的兩名游客交換位置並不算做一種新的情況來計數。

 1 public class Main {
 2 
 3     //a:0.5
 4     //b:1
 5 
 6     public static int digui(int a,int b) {
 7         if(a<b)//當剩下的隊列中五毛的比1元的少,則無法達到要求
 8             return 0;
 9         if(b==0)//沒有一元的,因為前面的a<b的限定條件五毛的一定比一元的少,即也沒有五毛的了
10             return 1;
11         else
12             return digui(a-1,b)+digui(a,b-1);
13     }
14 
15     public static void main(String[] args) {
16         System.out.println(digui(3,3));
17     }
18 
19 }

 在我做的時候是用的另外一種解法,即將所有的情況全排列出來(當然不要重復情況)然后從隊頭到隊尾五毛的+1,一元的-1,若小於0則不符合要求。




免責聲明!

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



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