剑指Offer-9-斐波拉契数列

来源:互联网 发布:java 去除换行符 编辑:程序博客网 时间:2024/05/20 09:24

递归实现+非递归实现

#include <iostream>using namespace std;//递归实现斐波那契数列 long long Fibonacci_Recursion(long long n) {    if(n == 0) return 0;    if(n == 1) return 1;    return Fibonacci_Recursion(n - 1)+Fibonacci_Recursion(n - 2);}//非递归实现斐波那契数列long long  Fibonacci(long long n){    if(n == 0) return 0;    if(n == 1) return 1;    int fibMinusOne = 0;    int fibMinusTwo = 1;    int fibN = 0;    while( n >= 2) {        fibN = fibMinusOne + fibMinusTwo;        fibMinusOne = fibMinusTwo;        fibMinusTwo = fibN;        n--;    }    return fibN;}int main(int argc, char *argv[]){    cout<<Fibonacci_Recursion(3)<<endl;    cout<<Fibonacci(3)<<endl;    return 0;}

斐波拉契数列延伸:
1.青蛙跳台阶
一只青蛙一次可以跳一级台阶,也可以跳上两级。求该青蛙跳上一个N级台阶共有多少种跳法。
分析:由题意显然,f(1)=1,f(2)=2;当n>2时,第一次跳有两种不同的选择:一是第一种只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即f(n-1),第二种是跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法,即f(n-2)。所以n级台阶的跳法为f(n)=f(n-1)+f(n-2);
显然根据分析,此题实际上就是斐波拉契数列。

2.矩形覆盖方法
我们可以用2*1的小矩形横着或竖着去覆盖更大的矩形(如图所示)。请问用8个2*1的小矩形无重叠地覆盖一个2*8的大矩形,共有多少种方法?
这里写图片描述
分析:我们把2*8的覆盖方法记为f(8),用第一个1*2的小矩形去覆盖大矩形的最左边是有两个选择,竖着放或横着放。竖着放时,右边剩余2*7的未覆盖区域,即为f(7),横着放时,当1*2的小矩形横着放在左上角的时候,左下角必须和横着放一个1*2的小矩形,并且右边区域剩余2*6的未覆盖区域即为f(6),所有f(8)=f(7)+f(6);显然,这也是一个斐波拉契数列。且f(1)=1,f(2)=2;

0 0
原创粉丝点击