【剑指offer】 斐波那契数列问题

博客介绍了斐波那契数列,它又称黄金分割数列、兔子数列,数学上以递推方法定义。还探讨了其在多个问题中的应用,如青蛙跳台阶、小矩形覆盖大矩形等,这些问题的结果都可通过递推得出为斐波那契数列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、斐波那契数列 (Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

代码实现如下:

// 斐波那契数列的java实现 
public static int Fibonacci(int n) {
    int last=1,latter=1,result=0; //用于缓存f(n-1) f(n-2)
    if (0==n)
        return 0;
    else if (1==n||2==n)
        return 1;
    else {
        for (int i=3;i<=n;i++){
            result=last+latter;  //计算f(n)
            last=latter;//更新f(n-2)
            latter=result;  //更新f(n-1)
        }
        return result;
    }
}

2、一只青蛙一次可以跳上1级台阶,也可以跳上2级。 求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

用递推可知其结果为斐波那契数列f(n)=f(n-1)+f(n-2)

public int JumpFloor(int n) {
int last=1,latter=2,result=0; //用于缓存f(n-1) f(n-2)
    if (0==n)
        return 0;
    else if (1==n)
        return 1;  
    else if(2==n)
        return 2;
    else {
        for (int i=3;i<=n;i++){
            result=last+latter;  //计算f(n)
            last=latter;//更新f(n-2)
            latter=result;  //更新f(n-1)
        }
        return result;
    }
}

3、附加:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

   static int jumpFloorII(int number) {//罗列各项,寻找规律,可知f(n)=2的n-1次方
    int result=1;
    return result<<(number-1);//将乘法优化为位运算
}

4、我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?罗列各项,寻找规律,递推可知其结果为斐波那契数列f(n)=f(n-1)+f(n-2)

 int rectCover(int target) {
    int last=1,latter=2,result=0; //用于缓存f(n)=f(n-1)+f(n-2)
    if (1==target)
        return 1;
    else if (2==target)
        return 2;
    else {
        for (int i=3;i<=target;i++){
            result=last+latter; //计算f(n)
            last=latter; //更新f(n-2)
            latter=result; //更新f(n-1)
        }
        return result;
    }

}

Coding Blog     Github Blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值