2010-11-25 36 views
4

J'écris une fonction qui renvoie une séquence de nombres de longueur variable:Équivalent dans Aller à un vecteur 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 
    } 
} 

On peut observer que la longueur finale de la séquence retournée sera n. Comment et quoi fib retourner pour atteindre Go idiomatique? Si la longueur n'était pas connue à l'avance, comment la valeur de retour et l'utilisation diffèrent-elles? Comment insérer des valeurs dans retval?

Répondre

3

Ici, nous savons combien de nombres; nous voulons n nombres de Fibonacci.

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

Sortie: 7 [0 1 1 2 3 5 8]


Ici, nous ne savons pas combien de chiffres; nous voulons tous les nombres de Fibonacci inférieurs ou égaux à 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) 
} 

sortie: 10 [0 1 1 2 3 5 8 13 21 34]


On peut également utiliser IntVector du Go vector package. Notez que type IntVector []int. Ne pas utiliser de vecteurs, utiliser des tranches.

+2

Vous pouvez nommer la valeur de retour et faire des choses avec elle ?! C'est génial! –

+0

Votre réponse est wiki communautaire, je suppose que vous n'obtiendrez pas vos points bien mérités, merci beaucoup pour une bonne réponse. –

+0

"Dans une liste de paramètres ou de résultats [fonction], les noms (IdentifierList) doivent tous être présents ou tous être absents.Si ils sont présents, chaque nom représente un élément (paramètre ou résultat) du type spécifié; chaque type correspond à un élément de ce type Les listes de paramètres et de résultats sont toujours entre parenthèses sauf que s'il y a exactement un résultat sans nom, il peut être écrit comme un type non-protégé. http://golang.org/doc/go_spec.html#Function_types – peterSO