斐波那契函数相关算法

最近在看算法,发现算法中有一类的可以用斐波那契函数去解决。

解释一些斐波那契函数:斐波那契函数是一个从第三项开始,每一项等于前俩项之和的一个特殊的函数。又称黄金分割数列。
例如:1,2,3,5,8,13,21,。…
显然这是一个线性递推数列。
先说一说这类型的算法吧。《少年班》相信大家应该看过吧,其中在招王大法的时候的测试问题就是一个典型的使用斐波那契函数去解决的问题;
一个人上楼梯,有n层阶梯,一次只能上1层或2层,请问有多少种算法?
这题乍一看好像与斐波那契函数没什么关系,但是我们仔细分析一下,
n=1时,有1种,当n=2时,有2种,当n=3时有3种,n=45种,n=58种 ,n=613种,以此类推
此时很明显可以看出 结果是1 ,2,3,5,8,13,21,34 …
这就符合了斐波那契函数的特性
从第三个开始满足
斐波那契函数的统通用公式
斐波那契函数的统通用公式
那么我们就可以利用斐波那契函数的特性来解决这个问题。

下面是一些java的算法方法
平推方法实现

**/**
* 平推方法实现
*/
public static long fibLoop(int num) {
    if(num < 2)
        return n;
    long a = 1;
    long b = 2;
    long temp;
    for(int i = 3; i <= num; i++) {
        temp = a;
        a = b;
        b += temp;
    }
    return b;
}**

递归方法实现

//②==================================
/**
* 递归方法实现
* f(n) = f(n - 1) + f(n - 2)
* 最高支持 n = 92 ,否则超出 Long.MAX_VALUE
* @param num n 
* @return f(n) 
*/
public static long fibRec(int num) {
    if(num < 1)
        return 0;
    if(num < 3)
        return 1;
    return fibRec(num - 1) + fibRec(num - 2);
}
 

带有缓存的方法

/**
* 带有缓存的方法,比fibRec方法性能好很多
*/
//③==================================
static long[] l = new long[93];
static {
    l[1] = 1;
}
public static long fibBuffRec(int num) {
    if(num < 1 || num > 92)
        return 0;
    if(l[num] == 0)
        l[num] = fibBuffRec(num - 1) + fibBuffRec(num - 2);
    return l[num];
}
 

/**
* 1,2,3,4,5,6, 7 ,8 
* 1,1,2,3,5,8,13,21
* 支持num超过92的超大型数字,使用了ArrayList进行缓存以提高性能
*/
//④==================================
static List<BigDecimal> list = new ArrayList<BigDecimal>(93);
static {
    list.add(BigDecimal.ZERO);
    list.add(BigDecimal.ONE);
}
public static BigDecimal fibBig(int num) {
    if(num < 0)
        return list.get(0);
    if (list.size() <= num)
        list.add(fibBig(num - 1).add(fibBig(num - 2)));
    return list.get(num);
}

这些普遍算法**适用于一些典型的案例:
1.阶梯问题(一次上1-2阶,n阶有多少种可能)
2.兔子繁殖问题(兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?)

此外补充一点
黄金分割
随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值 0.6180339887……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值