선수로 산다, 때론 좋은 코치로

[golang] A Tour of Go - 44 연습 문제 본문

개발 관련/go

[golang] A Tour of Go - 44 연습 문제

godsman 2018. 2. 1. 22:13

[golang] A Tour of Go - 44 연습 문제

https://go-tour-kr.appspot.com/#44


함수를 가지고 놀아봅시다.

fibonacci 함수를 구현합니다. 이 함수는 이어지는 피보나치 수를 반환하는 함수 (클로져)를 반환해야 합니다.


package main


import "fmt"


// fibonacci is a function that returns

// a function that returns an int.

func fibonacci() func() int {

}


func main() {

    f := fibonacci()

    for i := 0; i < 10; i++ {

        fmt.Println(f())

    }

}

Go 언어는 최근의 언어답게 함수를 값으로 할당할 수 있습니다. 그리고 클로져라는 개념도 있습니다.

클로져 개념은 Javascript를 이용해서 힘들게 이해하고 있습니다. Javascript를 자주 사용하지 않습니다.


피보나치 수는 0과 1로 시작하며, 다음 피보나치 수는 바로 앞의 두 피보나치 수의 합이 된다. - 위키백과

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...

f(0)=0, f(1)=0, f(n)=f(n-1)+f(n-2), n>1

이 문제는 클로져를 이용해서 문제를 풀어야 합니다. 호출할 때마다 fn2를 계산합니다.

fn2 := fn1 + fn0

fn1, fn0 = fn2, fn1 //Go에서는 변수 두개에 한 번에 값을 할당 할 수 있음

if fn2 == 0 { fn1 =1 }

피보나치 수는 재귀함수나 메모이제이션에서 연습하는 문제인데 클로저를 이해할 때도 활용하네요

func fibonacci() func() int {

    fn0 := 0

    fn1 := 0

    

    return func() int {

        fn2 := fn1 + fn0

        fn1, fn0 = fn2, fn1

        if fn2 == 0 {

            fn1 = 1

    }

        return fn2

    }   

}


A Tour of Go 예제 관련



Comments