1. 程式人生 > >藍橋杯第39階梯的遞迴實現[JAVA]

藍橋杯第39階梯的遞迴實現[JAVA]

問題分析:  看到這個問題首先想到的遞迴     定義一個方法 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);
}
}

此遞迴的執行過程類似於二叉樹的先序遍歷 下圖是轉自部落格: