【问题标题】:Is there a better code for printing fibonacci series?打印斐波那契数列有更好的代码吗?
【发布时间】:2015-01-05 21:52:26
【问题描述】:

下面的算法是生成斐波那契数列的最佳方法吗?还是有更好的方法?

这是我打印斐波那契数列的 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;
}        

【问题讨论】:

  • 在什么意义上更好?
  • bold for 循环中更好的逻辑
  • 请检查我对您问题的编辑是否正确。我试图澄清这个问题,因为目前它正在被否决(尽管我似乎很清楚)。
  • 这个问题似乎是题外话,因为它是关于 codereview.stackexchange.com/
  • 这能回答你的问题吗? stackoverflow.com/a/64133793/12817546.

标签: c


【解决方案1】:

除了@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
    }
}

【讨论】:

  • 感谢您的评论。但是这个答案扩展了 Go 中公认的答案。
  • 问题和接受的答案都是 6 岁!如果你有新的东西要说(总是好的),说一些新的和相关的
  • 在我看来,这确实说明了一些新的和相关的东西。 “堆栈溢出首先是一个 wiki”。见blog.codinghorror.com/…
【解决方案2】:

如果你仔细观察,还有一种更有效的方法来计算围棋,你会看到以下序列:

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

斐波那契数列的映射公式为:

那么如果你编写这个代码(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 的数字,并且不使用 基本案例的条件。我希望这种方法可以帮助您更好地理解问题!

干杯!

【讨论】:

    【解决方案3】:

    这在时间复杂度和空间复杂度方面是最优的,并且比在运行时间方面呈指数增长的朴素递归算法快得多。

    不过,看起来您在循环中的分配并不完全正确。你想要的

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

    但是,您的方法有一个关键的弱点,那就是您将很快超出int 的范围。即使是 64 位的值,当您达到 f(100) 时,您也会得到错误的答案。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      相关资源
      最近更新 更多