2010-11-25 2 views
4

Я пишу функцию, которая возвращает последовательность чисел переменной длины:Эквивалент в Перейти к C++ вектору <int>?

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?

ответ

3

Здесь мы знаем, сколько цифр; мы хотим 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 [1 1 0 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 vector package. Обратите внимание, что type IntVector []int.

+2

Вы можете назвать возвращаемое значение и сделать что-то с этим ?! Это потрясающе! – 2010-11-26 02:17:38

Смежные вопросы