青蛙跳臺階----斐波那契數列

題目要求

一隻青蛙一次可以跳上一節臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階共有多少種跳法?

題目分析

看到該題目,首先你可以在紙上畫一畫,想一想,從一級臺階往後推導,反正我是這麼做的,當推導上三四級以後,你就會發現一個規律。按照這種方法推導出來的臺階數與可以選擇的方法數之間的關係恰好就是斐波那契數列。那麼就不難寫出代碼了,關鍵就是我們常常用遞歸的方式來實現一個斐波那契數列,遞歸的時間和空間複雜度可能會很高,如果使用的不恰當的話,就會造成嚴重的問題:調用棧溢出。所以可不可以有一種方法能夠在O(n)的時間複雜度裏完成這個任務吶?答案是肯定的(我似乎體會到了編程的樂趣)。先來畫畫這個題目的大概思路吧。


很簡單的圖就能分析清整個問題的關鍵。


這樣一看,問題就轉換成了求斐波那契數列。接下來就是怎樣去掉重複計算的問題了,最先想到的方法就是我們能將以前計算出來結果的那些記錄把它們存起來,等下一次再要計算時直接拿出來用就好了。直接上代碼,簡單的例子:

int JumpCore(int n,int a,int b)
{
	if (n < 2)
		return a;
	else
		return JumpCore(--n,a+b,a);
}
int Jump(int n)
{
	if(n < 0)
		return -1;

	int a = 1;
	int b = 1;
	return JumpCore(n,a,b);
}

題目拓展

如果把條件改成一隻青蛙一次可以跳1級,可以跳2級,.......也可以跳n級,那麼有多少種跳法?

按照解決上述問題的思路,我們還是拿起小本本,自己多畫幾個例子,觀察觀察就能得出一個數學規律:f(n) = 2 ^(n-1)

總結

又到了總結的時候了,我太喜歡這個環節了,它意味着你把這個問題解決了,還從中收穫了不少東西。所以下面就是我所收穫的:遇到此類問題不要慌,在本子上畫一畫,數學問題一般都是有一個數學規律存在的,找出這個所謂的數學規律,接下來的事情就是用你擅長的語言把它描述出來。

博主又開始囉嗦了,寫給自己的,雖然每一個問題很簡單,但是正是這些小小的問題讓我對編程愛的深沉,我們只是用另外一種我們喜歡的語言在講故事而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章