package main
import (
"fmt"
"time"
)
const LIM = 41
var fibs [LIM]uint64
func main() {
var result uint64 = 0
start := time.Now()
for i := 0; i < LIM; i++ {
result = fibo(i)
fmt.Printf("fibonacci(%d) is: %d\n", i, result)
}
end := time.Now()
delta := end.Sub(start)
fmt.Printf("longCalculation took the amount of time: %s\n", delta)
start = time.Now()
f := fibo2()
for i := 0; i < LIM; i++ {
fmt.Printf("fibonacci(%d) is: %d\n", i, f())
}
end = time.Now()
delta = end.Sub(start)
fmt.Printf("closure took the amount of time: %s\n", delta)
start = time.Now()
c := make(chan int, LIM)
go fibo3(LIM, c)
for i := range c {
fmt.Println(i)
}
end = time.Now()
delta = end.Sub(start)
fmt.Printf("thread took the amount of time: %s\n", delta)
}
func fibo3(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
}
func fibo2() func() int {
v1, v2 := 0, 1
return func() int {
temp := v1
v1, v2 = v2, (v1 + v2)
return temp
}
}
func fibo(n int) (res uint64) {
if fibs[n] != 0 {
res = fibs[n]
return
}
if n <= 1 {
res = 1
} else {
res = fibo(n - 1) + fibo(n - 2)
}
fibs[n] = res
return
}
执行结果如下:
fibonacci(0) is: 1
fibonacci(1) is: 1
fibonacci(2) is: 2
fibonacci(3) is: 3
fibonacci(4) is: 5
fibonacci(5) is: 8
fibonacci(6) is: 13
fibonacci(7) is: 21
fibonacci(8) is: 34
fibonacci(9) is: 55
fibonacci(10) is: 89
fibonacci(11) is: 144
fibonacci(12) is: 233
fibonacci(13) is: 377
fibonacci(14) is: 610
fibonacci(15) is: 987
fibonacci(16) is: 1597
fibonacci(17) is: 2584
fibonacci(18) is: 4181
fibonacci(19) is: 6765
fibonacci(20) is: 10946
fibonacci(21) is: 17711
fibonacci(22) is: 28657
fibonacci(23) is: 46368
fibonacci(24) is: 75025
fibonacci(25) is: 121393
fibonacci(26) is: 196418
fibonacci(27) is: 317811
fibonacci(28) is: 514229
fibonacci(29) is: 832040
fibonacci(30) is: 1346269
fibonacci(31) is: 2178309
fibonacci(32) is: 3524578
fibonacci(33) is: 5702887
fibonacci(34) is: 9227465
fibonacci(35) is: 14930352
fibonacci(36) is: 24157817
fibonacci(37) is: 39088169
fibonacci(38) is: 63245986
fibonacci(39) is: 102334155
fibonacci(40) is: 165580141
longCalculation took the amount of time: 95.737µs
fibonacci(0) is: 0
fibonacci(1) is: 1
fibonacci(2) is: 1
fibonacci(3) is: 2
fibonacci(4) is: 3
fibonacci(5) is: 5
fibonacci(6) is: 8
fibonacci(7) is: 13
fibonacci(8) is: 21
fibonacci(9) is: 34
fibonacci(10) is: 55
fibonacci(11) is: 89
fibonacci(12) is: 144
fibonacci(13) is: 233
fibonacci(14) is: 377
fibonacci(15) is: 610
fibonacci(16) is: 987
fibonacci(17) is: 1597
fibonacci(18) is: 2584
fibonacci(19) is: 4181
fibonacci(20) is: 6765
fibonacci(21) is: 10946
fibonacci(22) is: 17711
fibonacci(23) is: 28657
fibonacci(24) is: 46368
fibonacci(25) is: 75025
fibonacci(26) is: 121393
fibonacci(27) is: 196418
fibonacci(28) is: 317811
fibonacci(29) is: 514229
fibonacci(30) is: 832040
fibonacci(31) is: 1346269
fibonacci(32) is: 2178309
fibonacci(33) is: 3524578
fibonacci(34) is: 5702887
fibonacci(35) is: 9227465
fibonacci(36) is: 14930352
fibonacci(37) is: 24157817
fibonacci(38) is: 39088169
fibonacci(39) is: 63245986
fibonacci(40) is: 102334155
closure took the amount of time: 65.417µs
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
thread took the amount of time: 76.03µs
Process finished with exit code 0
fibo使用的是内存缓存,最普通的实现方式,耗时最长;
fibo2使用的是函数闭包,耗时最短
fibo3使用的是协程+channel,耗时接近闭包结果