-
-
Save tetsuok/2281812 to your computer and use it in GitHub Desktop.
package main | |
import "fmt" | |
// Very naive answer. | |
// fibonacci is a function that returns | |
// a function that returns an int. | |
func fibonacci() func() int { | |
n := 0 | |
a := 0 | |
b := 1 | |
c := a + b | |
return func() int { | |
var ret int | |
switch { | |
case n == 0: | |
n++ | |
ret = 0 | |
case n == 1: | |
n++ | |
ret = 1 | |
default: | |
ret = c | |
a = b | |
b = c | |
c = a + b | |
} | |
return ret | |
} | |
} | |
func main() { | |
f := fibonacci() | |
for i := 0; i < 10; i++ { | |
fmt.Println(f()) | |
} | |
} |
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func(int) int {
return func(n int) int {
prev, next := -1, 1
// <=
for i := 0; i < n; i++ {
prev, next = next, prev+next
}
// return next
return prev + next
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f(i))
}
}
Hate the growing slice but just trying to use it to represent the math fibonacci numbers
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
var f,n int // Fn and n
s := []int{} // The sequence
return func() int {
if n > 1 { // Fn = Fn-1 + Fn-2
f = s[n-1] + s[n-2]
} else { // F0 = 0, F1 = 1
f = n
}
s = append(s,f) // Add Fn to the sequence
n++
return f
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
0
1
1
2
3
5
8
13
21
34
Hate the growing slice but just trying to use it to represent the math fibonacci numbers
package main import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func() int { var f,n int // Fn and n s := []int{} // The sequence return func() int { if n > 1 { // Fn = Fn-1 + Fn-2 f = s[n-1] + s[n-2] } else { // F0 = 0, F1 = 1 f = n } s = append(s,f) // Add Fn to the sequence n++ return f } } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }
0
1
1
2
3
5
8
13
21
34
Here is a much shorter version using a shifting slice to calculate the number instead of the growing slice with verbose if conditions:
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
s := []int{0,1}
return func() int {
f := s[0]
s = s[1:]
s = append(s,s[0]+f)
return f
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
0
1
1
2
3
5
8
13
21
34
Fibonacci closure is more fun than I thought!
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
a1 := 0
a2 := 1
return func() int {
f := a1
a1, a2 = a2, a2+f
return f
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
@toolchainx @stvr
Impressive! very much impressed
solution 1 using naked returns
func fibonacci() func() int {
first, second := 0, 1
return func() (ret int) {
ret, first, second = first, second, first+second
return
}
}
solution 2 using defer, circumventing the need for a third ret
variable
func fibonacci() func() int {
first, second := 0, 1
return func() int {
defer func() { first, second = second, first+second }()
return first
}
}
Zero-based:
func fibonacci() func() int {
fib1 := 0
fib2 := 1
return func() int {
fib1, fib2 = fib2, fib1+fib2
return fib2-fib1
}
}
One-based:
func fibonacci() func() int {
fib1 := 0
fib2 := 1
return func() int {
fib1, fib2 = fib2, fib1+fib2
return fib2
}
}
I used growing slice as well but clearly there are better answers here
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
seq := 0
var f []int
return func() int {
switch seq {
case 0,1:
f = append(f, seq)
default:
f = append(f, f[seq-2]+f[seq-1])
}
seq++
return f[len(f)-1]
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
func fibonacci() func() int {
prev := -1
now := 1
return func() int {
now += prev
prev = now - prev
return now
}
}
`package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int
func fibonacci() func(int) int {
sum := 0
sum1 := 0
sum2 := 1
return func(x int) int {
if x == 0 {
return sum1
} else if x == 1 {
return sum2
} else {
sum = sum1 + sum2
sum1 = sum2
sum2 = sum
return sum
}
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f(i))
}
}`
Feels succinct:
func fibonacci() func() int {
var a, b int = 1, 0
return func() int {
a, b = b, a + b
return a
}
}
Wired & fun solution
package main
import "fmt"
func fib() func(int) int {
a := 0
b := 1
return func(count int) int {
for ; count > 0; count-- {
a, b = b, a+b
}
return a
}
}
func main () {
fibCalc := fib()
fmt.Println(fibCalc(10))
}
func fibonacci() func() int {
num, back, n := 0, 1, 0
return func () int {
if n++; n == 1 {
return 0
}
num, back = num+back, num
return num
}
}
func fibonacci() func() int {
first := -1
second := 1
return func() int {
first, second = second, first + second
return second
}
}
func fibonacci() func() int {
i := -1
var fib func(i int) int
fib = func(x int) int {
switch x {
case 0:
return 0
case 1:
return 1
default:
return fib(x-1) + fib(x-2)
}
}
fib2 := func() int {
i++
return fib(i)
}
return fib2
}
func fibonacci() func() int {
a, b := 0, 1
fib := func() int {
var result int
if a == 0 {
result = 0
} else {
result = b
}
a, b = b, a+b
return result
}
return fib
}
func fibonacci() func() int {
array := [2]int {-1, 1}
return func() int{
res := array[0] + array[1]
array[0] = array[1]
array[1] = res
return res
}
}
package main import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func() int { first, second := 0, 1 return (func () int { first, second = second, first + second return second }) } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }
anybody can explain for me about this line "first, second = second, first + second" ? please, i don't understand
func fibonacci() func() int {
a,b,c := 0, 0, 1
return func() int {
a = b
b, c = c, b+c
return a
}
}
@QuanTT0110
similar to writing:
first = second
second = first + second
package main import "fmt" // fibonacci is a function that returns // a function that returns an int. func fibonacci() func() int { first, second := 0, 1 return (func () int { first, second = second, first + second return second }) } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }anybody can explain for me about this line "first, second = second, first + second" ? please, i don't understand
I think you need to create a copy. Remember you are using a accumulating reference in first and second. Also think about your logic one more time
I solved this using a defer
function:
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
var a, b int = 0, 1
return func() int {
update_fn := func() {
a, b = b, b+a
}
defer update_fn()
return a
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f())
}
}
package main
import "fmt"
// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func(int) int {
return func(x int) int {
switch x {
case 0:
return 0
case 1:
return 1
default:
return fibonacci()(x-1) + fibonacci()(x-2)
}
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f(i))
}
}
DAP server listening at: 127.0.0.1:65035
0
1
1
2
3
5
8
13
21
34
Process 36798 has exited with status 0
@webberwuuu tx for the heads up. After looking at this again I don't think any conditionals are necessary - I've updated my solution.