我正在编写一个函数,该函数返回一系列可变长度的数字:
func fib(n int) ??? {
retval := ???
a, b := 0, 1
for ; n > 0; n-- {
??? // append a onto retval here
c := a + b
a = b
b = c
}
}
可以观察到,返回序列的最终长度将是
n
。 fib
应该如何以及返回什么来实现惯用的Go?如果事先不知道长度,返回值和用法会有什么不同?如何将值插入retval
? 最佳答案
在这里,我们知道有多少个数字;我们想要n个斐波那契数。
package main
import "fmt"
func fib(n int) (f []int) {
if n < 0 {
n = 0
}
f = make([]int, n)
a, b := 0, 1
for i := 0; i < len(f); i++ {
f[i] = a
a, b = b, a+b
}
return
}
func main() {
f := fib(7)
fmt.Println(len(f), f)
}
输出:7 [0 1 1 2 3 5 8]
在这里,我们不知道有多少个数字。我们希望所有斐波那契数小于或等于n。
package main
import "fmt"
func fibMax(n int) (f []int) {
a, b := 0, 1
for a <= n {
f = append(f, a)
a, b = b, a+b
}
return
}
func main() {
f := fibMax(42)
fmt.Println(len(f), f)
}
输出:10 [0 1 1 2 3 5 8 13 21 34]
您还可以从Go IntVector中使用vector package。请注意
type IntVector []int
。关于arrays - 等价于转到C++向量<int>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4278715/