Created
April 16, 2012 17:00
-
-
Save Liangdi/2399968 to your computer and use it in GitHub Desktop.
Go语言练习:斐波纳契闭包
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" | |
// via http://www.talaland.com/go-tour-fibonacci/ | |
// fibonacci 函数会返回一个返回 int 的函数。 | |
func fibonacci() func() int { | |
//count 用于计数调用次数,只要考虑0和1,不知有没有其他更好的方法 | |
//sum1 和 sum2 用于储存 fib函数的两次和的值 | |
var count,sum1,sum2 int= 0,1,1 | |
return func() int { | |
switch count { | |
//0 和 1 fib=1 | |
case 0,1: | |
count++ | |
//其他 fib(n) = fib(n-1) + fib(n-2) | |
default: | |
sum1,sum2 = sum2,sum1+sum2 | |
} | |
return sum2 | |
} | |
} | |
func main() { | |
f := fibonacci() | |
for i := 0; i < 10; i++ { | |
fmt.Println(f()) | |
} | |
} |
func fibonacci() func() int {
a, b := -1, 1
return func() int {
a, b = b, a+b
return b
}
}
func fibonacci() func() int {
a, b := 1, 0
return func() int {
a, b = b, a+b
return b
}
}
@mgbaozi Good Job
func fibonacci() func() int {
prev := 0
curr := 0
return func(index int) func() int {
return func() int {
if index == 1 {
curr = 1
} else {
temp := curr
curr = temp + prev
prev = temp
}
index ++
return curr
}
}(0)
}
@mgbaozi Good Job
func fibonacci() func() int {
var x, y int = -1, 1
return func() int {
x, y = y, x + y
return y
}
}
It isn't necessary to use "switch".
uncorrect
var x, y int = 1, 0
func fibonacci() func(int) int {
return func(i int) int {
switch i {
case 0:
return 0
case 1, 2:
return 1
default:
return fibonacci()(i-1) + fibonacci()(i-2)
}
}
}
func main() {
f := fibonacci()
for i := 0; i < 10; i++ {
fmt.Println(f(i))
}
}
func fibonacci() func(x int) int {
start := make([]int,0,15)
start = append(start, 0)
start = append(start, 1)
res := func(x int) int {
start = append(start, start[x] + start[x+1])
return start[x]
}
return res
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
func fibonacci() func() int {
var x, y int = -1, 1
return func() int {
x, y = y, x + y
return y
}
}
It isn't necessary to use "switch".