藍橋杯第39階梯的遞迴實現[JAVA]
阿新 • • 發佈:2018-12-31
問題分析: 看到這個問題首先想到的遞迴 定義一個方法 int F( int n ) 不考慮其具體實現 我們令其可以實現返回這道題的解
; 繼續分析這道題的解集,有一點是可以確定的: 在解集中小明跨出的第一步有兩種情況①第一步跨越兩個階梯②第一步跨越一個階梯 那麼 問題的規模得以減小 我們很容易得到公式: F(n)=F(n-1)+F(n-2)
接下來考慮遞迴的出口問題:
當n=0這個問題不能被分解(原子問題)並得到一個解則 return 1;
當n<0這個問題無解則 return 0 .
可得到以下遞迴函式:
int F(int n) { if(n==0) { return 1; } if(n<=0) { return 0; } return F(n-1)+F(n-2); }
目前為止我們並沒有將偶數步的要求考慮在內, 要在遞迴函式內解決這個問題顯然F( ) 僅有一個引數是不夠的 思考之後可以增加一個boolean型別的引數mark 表示步數的奇偶
每走一步(每一次遞迴呼叫)就將mark的值取反 我這裡設定mark的初始值為false 那麼顯然就要求當n==0且mark=false時 我們就尋找到了問題的一個解 return 1, 否者 return 0 ;
所以 改進後的方法 F () 為:
int F(int n,boolean mark) { if(n==0&&mark==false) { return 1; } if(n<=0) { return 0; } return F(n-1,!mark)+F(n-2,!mark); }
附上原始碼:
public class Main {
public static void main(String[] args) {
boolean a = false;
System.out.println(F(39,a));
}
public static int F(int n,boolean mark) {
if(n==0&&mark==false) {
return 1;
}
if(n<=0) {
return 0;
}
return F(n-1,!mark)+F(n-2,!mark);
}
}
此遞迴的執行過程類似於二叉樹的先序遍歷 下圖是轉自部落格: