Assignment number 26 in the Go Tour.
Implement a Fibonacci function that returns a function (closure) that returns consecutive Fibonacci numbers (0, 1, 1, 1, 2, 3, 5, …).
Solution:
Fibonacci numbers are when each successive number is the sum of the previous two numbers. At first I made a simple variant in terms of logic, but it does not correlate with the terms of task reference. So I had to redo it.
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
n1 := 0
n2 := 1
return func() int {
// return n1 + n2.. save previous values and again
/*
sum := n1 + n2
n1 = n2
n2 = sum
return sum
// doesn't start with 0.. our goal is to print _1st_ number, not a summ
// we must return no the third number, but 1st number! but calculate next ones
*/
// 1) save n1 as tmp (we are gonna to print-return it!)
// 2) save n2 as n1
// 3) complete operation n1 + n2 and save it as n2
// 4) return tmp
tmp := n1
n1 = n2
n2 = tmp + n2
return tmp
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
And here, by the way, is a program that allows you to find the n-th number of the Fibonacci sequence using recursion:
package main
import "fmt"
func fib(n int) int {
if n < 2 {
return n
}
return fib(n - 1) + fib (n - 2)
}
func main () {
var n int
fmt.Print("Which element of Fibonacci sequence to show? ")
fmt.Scanf("%d", &n)
fmt.Println(fib(n))
}
Also common way with for cycle
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
r := bufio.NewReader(os.Stdin)
input, _ := r.ReadString('\n')
trim := strings.TrimSpace(input)
n, _ := strconv.Atoi(trim)
var n1 int = 0
var n2 int = 1
for i := 0; i < n; i++ {
tmp := n1
n1 = n2
n2 = tmp + n2
fmt.Println(tmp)
}
}