【问题标题】:Returning the lenght of a vector idiomatically惯用地返回向量的长度
【发布时间】:2011-05-15 18:57:34
【问题描述】:

我正在编写一个返回可变长度数字序列的函数:

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
    }
}

可以观察到返回序列的最终长度为nfib 应该如何以及返回什么来实现惯用的 Go?如果事先不知道长度,返回值和用法会有什么不同?如何将值插入retval

【问题讨论】:

    标签: go


    【解决方案1】:

    在这里,我们知道有多少个数字;我们想要 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 vector package 中的 IntVector。注意type IntVector []int

    【讨论】:

    • 您可以命名返回值并对其进行处理?!太棒了!
    • "在 [function] 参数或结果列表中,名称 (IdentifierList) 必须全部存在或全部不存在。如果存在,每个名称代表一个项目(参数或结果) “ golang.org/doc/go_spec.html#Function_types
    • "结果参数充当普通的局部变量,函数可以根据需要为它们赋值。...所有结果值在进入函数时都被初始化为它们的类型的零值。 " golang.org/doc/go_spec.html#Return_statements
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2012-05-23
      • 2023-01-26
      • 1970-01-01
      • 2023-03-12
      • 2015-11-27
      相关资源
      最近更新 更多