3

Secuencia de Fibonacci en Go

Osmandi
osmandi
45024
<h1>¿Qué es la secuencia de Fibonacci?</h1>

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:

Alt text

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.

Nota: Puedes cambiar el 20 del buble for por cualquier otro número y tendrás la secuencia de fibonacci.

<h1>Conclusión</h1>

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?

Escribe tu comentario
+ 2
1
3 años

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.

1
5 años

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