斐波那契数列:
1. 原始方法 ,经典方法
#include<iostream>
using namespace std;
long long Fibonacci(unsigned n)
{
if(n==0||n==1)
return n;
else if(n>1)
return Fibonacci(n-1)+Fibonacci(n-2);
}
2. 改进方法,将已经计算出的值存储起来 下次直接使用,不用再次计算。
f(0) , f(1) 得f(2)=f(0)+f(1),,,f(3)=f(2)+f(1);,,,,,,
long long Fibonacci(unsigned n)
{
int result[2]={0,1};
if(n<2)
return result[n];
long long FibonacciOne=1;//f(n-1)
long long FibonacciTow=0;//f(n-2)
long long Fibon=0;
for(unsigned int i=2;i<=n;++i)
{
Fibon=FibonacciOne+FibonacciTow;//f(n)=f(n-1)+f(n-2)
FibonacciTow=FibonacciOne;//f(n-2+1) 变成 f(n-1)
FibonacciOne=Fibon;// f(n-1+1) 变成 f(n) 循环下去
}
return Fibon;
}
还有一些题目都可以看成是斐波那契数列的应用。
应用一:
题目二:一只青蛙依次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个
n级的台阶总共多少种跳法。
1. 只有1级台阶 ,只有一种跳法。f(0)=0 / f(1)=1
2. 2级台阶 两种跳法。一种是分两次跳 f(2)=2
3. 3级台阶 f(n)=f(n-1)+f(n-2)
应用二:
将题目二:条件改为:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。。。。
也可以跳上n级台阶,此时该青蛙跳上一个n级的台阶总共多少种跳法。
1. 只有1级台阶 ,只有一种跳法。 f(1)=1
2. 2级台阶 两种跳法。一种是分两次跳 f(2)=2
......
用数学归纳法可以得到: f(n)=2^(n-1)
应用三:
题目:用2*1的小矩形横着或竖着去覆盖更大的矩形。请问用8个2*1的小矩形无重叠
地覆盖一个2*8的大矩形,总共多少种方法。
1. 先把 2*8 的覆盖方法记为 f(8)。用第一个1*2的小矩形去覆盖大矩形的最左边时有两个
选择,竖着放或者横着放。
2.竖着放时,右边还有2*7 的区域,这时的覆盖方法记为 f(7) .
3.横着放时,当1*2 的小矩形横着放在左上角的时候,左下角必须横着放一个1*2的小矩形,
而在右边还剩一个2*6的区域,这种情况下覆盖方法记为 f(6).因此 f(8)=f(6)+f(7).
可以看出此时仍然是斐波那契数列。
public class Solution {
public int RectCover(int target) {
if(target==0){
return 0;
}
if (target == 1) {
return 1;
}
if (target == 2) {
return 2;
}
return RectCover(target - 1) + RectCover(target - 2);
}
}