-
-
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()) | |
} | |
} |
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
I used growing slice as well but clearly there are better answers here