印刷斐波那契系列有更好的代码吗?

时间:2014-11-09 14:54:37

标签: c

算法是否是生成Fibonacci系列的最佳方法?或者有更好的方法吗?

这是我打印斐波纳契系列的C程序。

#include<stdio.h>
int main()
{
    int a,i,n,t;
    printf("Enter the number");
    scanf("%d",&a);

    i=1;
    n=0;

    for(t=1;t<=a;t++)
    {
        n=n+i;
        i=n-i;
        printf("%d",n);
    }

    return 0;
}        

3 个答案:

答案 0 :(得分:3)

这在时间复杂度和空间复杂度方面是最优的,并且比天然递归算法快得多,后者在运行时方面是指数级的。

看起来你的循环中的作业看起来并不是很正确。你想要

int oldi = i;
i = n+i;
n = oldi;

然而,你的方法有一个至关重要的弱点,那就是你会快速溢出int的界限。即使使用64位值,当你达到f(100)时,你也会得到错误的答案。

要获得任意索引的正确答案,您需要一个任意大小的整数库。

昨天与calculating the Fibonacci series in Go提出了一个相关问题。

答案 1 :(得分:0)

如果仔细观察,还有一种更有效的方法来计算Go,您将看到以下序列:

1 1 2 3 5 8 13 21 34 55 89 144 ...

映射Fibonacci序列的公式是:

然后,如果你编码(Go):

package main

import "fmt"

func fibonacci() func() int {
    first, second := 0, 1
    return func() int {
        ret := first
        first, second = second, first+second
        return ret
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 100; i++ {
        fmt.Println(f())
    }
}

您会看到数字达到100而不使用基本情况的条件。我希望这种方法能帮助你更好地理解这个问题!

干杯!

答案 2 :(得分:0)

除了@RogerFernandezGuri的出色答案外,Go语言中打印斐波那契数列的答案可能更易读。

package main

import "fmt"

func main() {
    a, b := 0, 1
    h := func() int {
        a, b = b, a+b
        return b-a
    }
    fibonacci := func() func() int { return h }
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f()) //0, 1, 1, 2, 3, 5, 8, 13, 21, 34
    }
}