费波那也数列的非递归实现

  • n =0, f(0) = 0;
  • n = 1, f(1) = 1
  • n > 1, f(n) = f(n-1) + f(n-2)

使用 2 个临时变量,存储 n-1 和 n-2 的费波那也数;
f(2) = f(0) + f(1) ,因此用f(2) 覆盖 f(0) ,因为 f(1) 仍然需要保留;即 f(0) = f(0) + f(1)
f(3) = f(1) + f(2) , 因此用f(3) 覆盖 f(1) ,因为 f(2) 仍然需要保留;即 f(1) = f(1) + f(0)
如上所示,偶数 n 的费波那也数存于 f(0); 奇数 n 的费波那也数存于 f(1)

long Fibonacci(unsigned int n) {
    long result[2] = {0, 1};
    for (int i = 2; i <= n; i++) {
        unsigned int index = (i & 0x01); // 2存于 result[0],因为存储1的 result[1]还要使用
        result[index] = result[index] + result[1-index];
    }
    return result[n & 0x01];
}

long Fibonacci2(unsigned int n)
{
    long result[2] = {0, 1};
    long Fib_n;
    for (int i = 2; i <= n; i++) {
        Fib_n = result[0] + result[1];
        result[0] = result[1];
        result[1] = Fib_n;
    }
    return Fib_n;
}

相关问题:青蛙跳台阶,可以跳 1 级或跳 2 级,跳到第 n 级台阶,有几种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值