Эквивалент в Go для C ++ вектора <int>? - PullRequest
4 голосов
/ 25 ноября 2010

Я пишу функцию, которая возвращает последовательность чисел переменной длины:

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 для достижения идиоматического Го?Если длина не была известна заранее, как будет отличаться возвращаемое значение и использование?Как вставить значения в retval?

Ответы [ 2 ]

3 голосов
/ 25 ноября 2010

Здесь мы знаем, сколько чисел;мы хотим 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]


Вы также можете использовать IntVector из векторного пакета Go .Обратите внимание, что type IntVector []int.

0 голосов
/ 08 декабря 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...