为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
斯蒂芬大帝 2023-07-04 19:04:28
我搜索过较旧的问题,有很多。但是我找不到我的案例的答案。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 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

更改您的函数以将 res 返回为此:


 return func () int {


    res := y

    y = z

    z = res + z


    return res


}

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


查看完整回答
反对 回复 2023-07-04
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

例如,


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


查看完整回答
反对 回复 2023-07-04
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

如果您添加:

x := y

并将返回语句更改为

return x

您将返回初始y := 0值,而不是计算值res := y + z,因此返回序列中较早的值 2 ,给您0, 1, 1, 2, 3, 5, ...

(但我不认为-1, 1初始化器是黑客。)


查看完整回答
反对 回复 2023-07-04
  • 3 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信