Interview100-19 输出Fibonacci数列的第n项

题目

一直Fibonacci数列,输入n,用最快的方式求改该数列的第n项。

解法

1. 递归方法。这是一个经典的递归求解方法,我们知道Fibonacci数列的递归式为F(n) = F(n-1)+F(n-2)。这样就可以使用递归的方式求得该数列的第n项。但这种方式总是在计算重复的值,例如计算F(8)时计算了F(1)到F(7),而计算F(9)时有计算了一遍F(1)到F(8),其中F(1)到F(7)重复计算了多次,这样会导致运行效率很低。

2. 非递归的方式,使用动态规划的思想,自底向上计算每一项的值,这样就避免了多个元素的重复计算。可以节省很多时间,时间复杂度为O(n)。

3. 还有一种更快的方法,时间复杂度为O(nlgn)。

递归方式

FIBONACCI-N(int n):
    if n == 1 or n == 2:
        return 1;
    else 
        return FIBONACCI-N(n-1) + FIBONACCI-N(n-2)

非递归方式

FIBONACCI-INTERVAL(int n):
    if n == 1 or n == 2:
        return 1;
    int minus_one = 1;
    int minus_two = 1;
    int result = 0;
    for i = 3 to n:
        result = minus_one + minus_two;
        minus_two = minus_one;
        minus_one = result;
    return result;

在自底向上计算第n项的值的循环中,计算完当前result值后,使用minus_one的值更新minus_two,并用result的值更新minus_one,这样就可以自底向上的逐步计算出第n项的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值