我应该在代码中更改什么以生成从 0 1 1 开始的斐波那契数列
What should I change in the code to generate a fibonacci sequence starting from 0 1 1
我搜索了较早的问题,有很多。但是我找不到我的案例的答案。
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
但这是一个幸运的 hack,我想要一个合乎逻辑的解决方案。
将您的函数更改为 return 解决此问题:
return func () int {
res := y
y = z
z = res + z
return res
}
这样你先输出初始值,再计算下一个值。您当前的解决方案会在 returned 之前覆盖初始值。
例如,
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
如果您添加了:
x := y
并将 return 语句更改为
return x
您将 returning 初始 y := 0
值,而不是计算的 res := y + z
,因此 returning 序列中较早的值 2,给您0, 1, 1, 2, 3, 5, ...
(但我不认为 -1, 1
初始化器是 hack。)
我搜索了较早的问题,有很多。但是我找不到我的案例的答案。
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
但这是一个幸运的 hack,我想要一个合乎逻辑的解决方案。
将您的函数更改为 return 解决此问题:
return func () int {
res := y
y = z
z = res + z
return res
}
这样你先输出初始值,再计算下一个值。您当前的解决方案会在 returned 之前覆盖初始值。
例如,
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
如果您添加了:
x := y
并将 return 语句更改为
return x
您将 returning 初始 y := 0
值,而不是计算的 res := y + z
,因此 returning 序列中较早的值 2,给您0, 1, 1, 2, 3, 5, ...
(但我不认为 -1, 1
初始化器是 hack。)