Fibonacci算法

看到了一个优雅的迭代算法。
本质思想都很简单,迭代的话,每个数只与前面两个数有关。
最容易想到的递归,毙了;
然后是数组,每一个都等于前两个之和,for循环一遍,空间占用,毙了;
再然后我的算法:

public int Fibonacci(int n) {
        if(n==0) return 0;
        if(n==1)return 1int f1=1;int f2=1;
        for(int i=2;i<n;i++){
            if(i%2==0)f1=f1+f2;
            else f2=f1+f2;
        }
        return n%2==0?f2:f1;
    }

可以解决但是不够优雅,为了一个这个分奇偶。主要问题是想不出更好的办法来模拟两个数相加然后再这样一直迭代下去。

优雅的算法:

链接:https://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3
来源:牛客网
听说:谭浩强版有

    int Fibonacci(int n) {
        int f = 0, g = 1;
        while(n--) {
            g += f;
            f = g - f;
        }
        return f;
    }

g += f; //求和这个很容易想到
f = g - f; //这个就比较有趣了,通过再减一下把被覆盖的g还原处来。
这么看:

f=0  g=1
  \  |   \
g前面的和  f=原来的g
        \|       |  
    g前面的和    f=原来的g
    ..............

最后return的是f,这就是n的问题了。

然后是这题的变形跳台阶。每次最多一跳或两跳。

再然后是每次<=N跳的。


比较直观的想法:
N个台阶跳法可以分为:
1.先上一节,再直接到终点,这里跳法有1种(f(1));
2.先上两节,再直接到终点,这里跳法有2种(f(2));
3.先上3节,再直接到终点,有f(3)种;
....
N.直接N节,有1种。
所以总的f(N)=f(1)+f(2)+f(3)+.......+f(N-1)+1种。
f(1)和f(2)已知


化简一下,
f(N)=2^(N-1).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值