該類問題兩大特征: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則不符合要求。