2010-11-25 5 views
4

Ich schreibe eine Funktion, die eine Folge von Zahlen mit variabler Länge zurückgibt:Entspricht in Gehe zu einem C++ Vektor <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 
    } 
} 

Es beobachtet werden kann, dass die endgültige Länge der zurückgegebenen Sequenz n sein wird. Wie und was sollte fib zurückkehren, um idiomatische Go zu erreichen? Wenn die Länge nicht im Voraus bekannt war, wie würden sich der Rückgabewert und die Verwendung unterscheiden? Wie füge ich Werte in retval ein?

Antwort

3

Hier wissen wir, wie viele Zahlen; Wir wollen n Fibonacci-Zahlen.

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

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


Hier wissen wir nicht, wie viele Zahlen; Wir wollen alle Fibonacci-Zahlen kleiner oder gleich 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) 
} 

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


Sie auch IntVector vom Go vector package nutzen könnten. Beachten Sie, dass type IntVector []int.

+2

Sie können den Rückgabewert nennen und Sachen damit machen ?! Das ist großartig! –

+0

Ihre Antwort ist Community-Wiki, ich vermute, Sie werden Ihre wohlverdienten Punkte nicht bekommen, vielen Dank für eine gute Antwort. –

+0

"Innerhalb einer Liste von [function] Parametern oder Ergebnissen müssen die Namen (IdentifierList) entweder alle vorhanden sein oder alle nicht vorhanden sein. Wenn vorhanden, steht jeder Name für ein Element (Parameter oder Ergebnis) des angegebenen Typs. jeder Typ steht für einen Eintrag dieses Typs. Parameter- und Ergebnislisten sind immer in Klammern gesetzt, außer dass bei genau einem unbenannten Ergebnis dieser als nicht aufgezeichneter Typ geschrieben werden kann. " http://golang.org/doc/go_spec.html#Function_types – peterSO