斐波那契額數列及青蛙跳台階問題


 

題目:寫一個函數,輸入n,求斐波那契(Fibonacci)數列的第n項。

 斐波那契(Fibonacci)數列定義如下:

效率很低的解法:

long long Fibonacci_Solution1(unsigned int n)
{
    if(n <= 0)
        return 0;

    if(n == 1)
        return 1;

    return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
}

 

改進的算法:從下往上計算。首先根據f(0)和f(1)算出f(2),再根據f(1)和f(2)算出f(3)。。。。。依此類推就可以算出第n項了。很容易理解,這種思路的時間復雜度是o(n)。實現代碼如下:

long long Fibonacci(unsigned n)
{
	int result[2] = {0 , 1};
	if(n < 2)
		return result[n];

	long long fibMinusOne = 1;
	long long fibMinusTwo = 0;
	for(unsigned int i = 2 ; i <= n ; ++i)
	{
		fibN = fibMinusOne + fibMinusTwo;

		fibMinusTwo = fibMinusOne;
		fibMinusOne = fibN;
	}
	
	return fibN;
}

 

題目:一只青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上一個n級的台階總共有多少種跳法。

 

可以把n級台階時的跳法看成是n的函數,記為f(n)。當n>2時,第一次跳的時候就有兩種不同的選擇:一是第一次只跳1級,此時跳法數目等於后面剩下的n-1級台階的跳法數目,即為f(n-1);另一種選擇是第一次跳2級,此時跳法數目等於后面剩下n-2級台階的跳法數目,即為f(n-2)。因此,n級台階的不同跳法的總數f(n)=f(n-1)+f(n-2)。分析到這里,不難看出這實際上就是斐波那契數列了。

#include<iostream>
using namespace std;

 long Fibonacci_Solution1(unsigned int n)
{
    if(n <= 0)
        return 0;

    if(n == 1)
        return 1;

    return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
}

int main()
{
    int n;
	cin>>n;
	cout<<Fibonacci_Solution1(n)<<endl;
   
   return 0;
}

 

 在青蛙跳台階的問題中,如果把條件改成:一只青蛙一次可以跳上1級台階,也可以跳上2級。。。。。它也可以跳上n級,此時該青蛙跳上一個n級的台階總共有多少種跳法?

用數學歸納法可以證明f(n)=2n-1.

 

 


免責聲明!

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



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