Es básicamente la secuencia de un conjunto de números que empieza por el 0 y el 1 y los siguientes son la suma de sus dos números anteriores.
Por ejemplo: 0, 1, 1, 2, 3, 5…
La primera vez que escuché de tan curiosa secuencia fue cuando ví la película del código Da Vinci:
Volví a a ver esta secuencia cuando estaba entrando en la documentación de go en golang.org.
<h1>¿Qué es una función?</h1>Pues en este punto ya debes saber cómo hacer para retornar una variable a través de una función.
Del mismo modo, las funciones también pueden retornar una función.
<h1>Algoritmo de fibonacci con Go</h1>Empezamos declarando el paquete main y librería a usar
package main
import"fmt"
Decidí declarar un slice a como variable global para guardar allí los valores y poder tener la secuencia.
vara []int
Luego la función clausura
func fibonacci() func(int) int {
return func(x int) int {
if x >= 2 {
xf := a[x-1] + a[x-2]
a = append(a, xf)
return xf
}
a = append(a, x)
return (a[x])
}
}
Recibirá un valor representado en x que es el contador del bucle for dentro de la función maín.
Si dicho valor es 0 o 1, lo guardará en el slice gloabl a y lo retornará.
Si es 2 o mayor, sumará los dos valores anteriores guardados en el slice a, guardará este valor con la función append(a, xf) y finalmente lo retornará.
Para finalizar la función main
funcmain() {
f := fibonacci()
for i := 0; i < 20; i++ {
fmt.Println(f(i))
}
}
Se crea una variable que instancie la función fibonacci(), lo pase a un buble for quien se encargará de crear la secuencia dependiente del contador del for.
<h1>Conclusión</h1>Nota: Puedes cambiar el 20 del buble for por cualquier otro número y tendrás la secuencia de fibonacci.
El código completo lo tienes aquí
package main
import"fmt"// Fibonacci es una función que devuelve una// función que devuelve un int.var a []intfunc fibonacci() func(int) int {
returnfunc(x int) int {
if x >= 2 {
xf := a[x-1] + a[x-2]
a = append(a, xf)
return xf
}
a = append(a, x)
return (a[x])
}
}
func main() {
f := fibonacci()
for i := 0; i < 20; i++ {
fmt.Println(f(i))
}
}
Y probarlo en la plataforma de Go Aquí
Este es el código de golang.org respecto a la secuencia de Fibonacci
package main
import "fmt"
// fib returns a function that returns// successive Fibonacci numbers.funcfib()func() int {
a, b := 0, 1returnfunc() int {
a, b = b, a+b
return a
}
}
funcmain() {
f := fib()
// Function calls are evaluated left-to-right.
fmt.Println(f(), f(), f(), f(), f())
}
Que puedes probar aquí
Como siempre ha sido un placer, te deseo un feliz y exitoso año nuevo 2018.
Cuéntame, ¿cómo crees que este código puede ser mejorado?
Un pequeño upgrade al método:
func Fib(n int, vault map[int]int) int{ value, isVal := vault[n] if isVal { returnvalue } if n <= 2 { return1 } vault[n] = Fib(n-1, vault) + Fib(n-2, vault) return vault[n] }
Eso sería una código de Fibonnaci en Go usando memoización. El principio de esto es guardar el computo y evitar un call stack de recursión innecesario. Haciendo uso de un map o diccionario se guarda el computo basado en el N que sea llamado en ese momento y como un map es de tipo referencia (en este contexto - porque hay casos en los que no) no hay necesidad de pasar un pointer.
Fiz a minha e achei muito simples, sabe o que posso melhorar?
//Sequencia de Fibonacci func fib(m, n int) int { // Aqui recebe a anterior e a anteanteriorseq := n + m return seq } func main() { //Aqui tem um for para enviar a anterior e a anteanterioratual := 1anterior := 0anteAnterior := 0fori := 0; i < 20; i++ { fmt.Print(atual, "-") anteAnterior = anterior anterior = atual atual = fib(anterior, anteAnterior) } }```