Last active
June 29, 2024 22:04
-
-
Save weppos/7843653 to your computer and use it in GitHub Desktop.
A Tour of Go Exercise: Fibonacci closure
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "fmt" | |
// fibonacci is a function that returns | |
// a function that returns an int. | |
func fibonacci() func() int { | |
f2, f1 := 0, 1 | |
return func() int { | |
f := f2 | |
f2, f1 = f1, f+f1 | |
return f | |
} | |
} | |
func main() { | |
f := fibonacci() | |
for i := 0; i < 10; i++ { | |
fmt.Println(f()) | |
} | |
} |
package main
import "fmt"
func fibonacci() func() int {
a, b := 1, 0
return func() int {
a, b = b, a + b
return a
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
hehe basically we all disagree about variables names 😄
package main
import "fmt"
// fibonacci is a fucntion that returns
// a function that returns an int.
func fibonacci() func() int {
current, next := 0, 1
return func() int {
fib := current
current, next = next, current+next
return fib
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
P.S.: The solution with the defer
statement is pure gold 🥇
P.S.: The solution with the
defer
statement is pure gold 🥇
Could you please elaborate on what's so special about using defer here? I do not see any improvement over not using it.
Could you please elaborate on what's so special about using defer here? I do not see any improvement over not using it.
two things:
- When I was solving the exercise, using
defer
never crossed my mind, so when I saw that solution it was anahá moment
🤯 - I saw it as a readability improvement for sure, the combination between
Function closures
(link) and thedefer
statement, imho it's way simpler to read:
func fibonacci() func() int {
current, next := 0, 1
return func() int {
defer func() {
current, next = next, current+next
}()
return current
}
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
f1 := 0
f2 := 1
reFunc := func() int {
f := f1
f1 = f2
f2 = f + f1
return f
}
return reFunc
}
func main() {
f := fibonacci()
for i := 0; i < 100; i++ {
fmt.Println(f())
}
}