代码之家  ›  专栏  ›  技术社区  ›  Nurbol Alpysbayev

我应该在代码中更改什么来生成从0 1 1开始的斐波那契序列

  •  -2
  • Nurbol Alpysbayev  · 技术社区  · 5 年前

    我已经搜索了很多老问题。但是我找不到我的案子的答案。

    
    func fibonacci() func() int {
        y := 0
        z := 1
    
        return func () int {
    
            res := y + z
            y = z
            z = res
    
            return res
    
        }
    }
    
    func main() {
        f := fibonacci()
        for i := 0; i < 10; i++ {
            fmt.Println(f())
        }
    }
    

    这产生1 2 3 5 8

    我应该改变什么(尽可能少)来得到0 1 1 2 3 5 8?

    事实上,我解决了这个问题 y z 就像这样:

        y := -1
        z := 1
    

    但这是一个幸运的黑客,我想要一个合乎逻辑的解决方案。

    3 回复  |  直到 5 年前
        1
  •  1
  •   samgak    5 年前

    更改您的函数以返回res:

     return func () int {
    
        res := y
        y = z
        z = res + z
    
        return res
    
    }
    

    这样,首先输出初始值,然后计算下一个值。当前的解决方案将在返回初始值之前覆盖它们。

        2
  •  1
  •   AJNeufeld    5 年前

    如果您添加了:

    x := y
    

    并将返回语句更改为

    return x
    

    你会把首字母还给我的 y := 0 值,而不是计算的 res := y + z ,因此在序列的前面返回值2, 0, 1, 1, 2, 3, 5, ...

    (但我不会考虑 -1, 1 初始化一个黑客。)

        3
  •  1
  •   peterSO    5 年前

    例如,

    package main
    
    import "fmt"
    
    // fibonacci returns a function that returns
    // successive Fibonacci numbers.
    func fibonacci() func() int {
        a, b := 0, 1
        return func() (f int) {
            if a < 0 {
                panic("overflow")
            }
            f, a, b = a, b, a+b
            return f
        }
    }
    
    func main() {
        f := fibonacci()
        for i := 0; i < 10; i++ {
            fmt.Println(f())
        }
    }
    

    操场: https://play.golang.org/p/uYHEK_ZgE6K

    输出:

    0
    1
    1
    2
    3
    5
    8
    13
    21
    34