斐波那契数列及其应用

来源:互联网 发布:汽车产业网络平台 编辑:程序博客网 时间:2024/05/22 06:56

定义:斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

特别指出:第0项是0,第1项是第一个1。

这个数列从第2项开始,每一项都等于前两项之和。
常规解法
long long Fibonacci(unsigned int n)
{
if(n<=0)
return 0;
if(n==1)
return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
效率更高的解法
#include<iostream>
using namespace std;


int main()
{
int n;
int pre1=1;
int pre2=2;
int next;
cin>>n;
while(n--){
next=pre1+pre2;
pre1=pre2;
pre2=next;
}
cout<<next<<endl;
system("pause");
return 0;
}
问题的变种:

问题描述:

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,请问这只青蛙跳上n级的台阶总共有多少种跳法?

问题分析:

设青蛙跳上n级台阶的跳法为f(n)种.

设Fibonacci数列的第x项值为fibo(x).

(1)当n=1时,f(n)=1

(2)当n=2时,f(n)=2

(3)当n>2时,分析可知,在跳上第n级台阶前一步,必然是在第(n-1)或(n-2)级台阶,故有f(n) = f(n-1) + f(n-2); 依此类推...

本质上还是斐波那契数列

下面看一个矩形覆盖问题
题目描述:

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入包括一个整数n(1<=n<=70),其中n为偶数。

输出:

对应每个测试案例,

输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数。

观察题目中的矩形,2*n的,是个长条形。本来脑中想象的是复杂的华容道,但是既然只是简单的长条形,那么依然逆向分析。既然是长条形的,那么从后向前,最后一个矩形2*2的,只有两种情况:
   第一种是最后是由一个2*(n-1)的矩形加上一个竖着的2*1的矩形
  另一种是由一个2*(n-2)的矩形,加上两个横着的2*1的矩形
本质上还是斐波那契数列
0 0
原创粉丝点击