Язык Go. Замыкания и Числа Фибоначчи


Задание номер 26 в Туре Го.

Реализуйте функцию Фибоначчи, которая возвращает функцию (замыкание), возвращающую последовательные числа Фибоначчи (0, 1, 1, 2, 3, 5, …).

Решение:

 Числа Фибоначчи — это когда каждое следующее число является суммой двух предыдущих. Сначала я сделал простой с точки зрения логики вариант, но он не соотносится с техзаданием.. Поэтому пришлось переделать.

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

А вот, кстати, программа, которая позволяет найти n-ый член последовательности Фибоначчи при помощи рекурсии:

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

Ну и обычный способ на цикле for

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

 


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

2 комментария на «Язык Go. Замыкания и Числа Фибоначчи»

  1. Witcher говорит:

    Серверную часть игры на Go решил делать? Да, неплохой вариант для быстрого старта, возможно в этом и есть смысл. Замечу, что один из авторов языка Go — Кен Томпсон, он же соавтор и языка Си, поэтому и похож.

Добавить комментарий для Компьютерщик Отменить ответ

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.