Skip to content

Instantly share code, notes, and snippets.

@xpunch
Created November 10, 2018 15:26
Show Gist options
  • Save xpunch/21179f8d7f613d2faa172c4b413536c4 to your computer and use it in GitHub Desktop.
Save xpunch/21179f8d7f613d2faa172c4b413536c4 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"time"
)
func main() {
n := 999999
// fmt.Println(fibonacci_recursion(n))
// fmt.Println(fibonacci_recursion_append(n))
// fmt.Println(fibonacci_single_channel(n))
// fmt.Println(fibonacci_multiple_channel(n))
t := time.Now()
// fibonacci_recursion(n)
// fmt.Printf("%v:Recursion Caculate\n", time.Now().Sub(t))
// t = time.Now()
fibonacci_recursion_append(n)
fmt.Printf("%v:Recursion Append\n", time.Now().Sub(t))
t = time.Now()
fibonacci_single_channel(n)
fmt.Printf("%v:Single Channel\n", time.Now().Sub(t))
t = time.Now()
fibonacci_multiple_channel(n)
fmt.Printf("%v:Multiple Channel\n", time.Now().Sub(t))
}
func fibonacci_recursion(n int) []int64 {
arr := make([]int64, n)
// fmt.Println(unsafe.Pointer(&arr))
fibonacci_recursion_calc(&arr, n)
return arr
}
func fibonacci_recursion_calc(arr *[]int64, n int) int64 {
var v int64
if n == 1 {
v = 1
} else if n == 2 {
v = 1
} else {
v = fibonacci_recursion_calc(arr, n-2) + fibonacci_recursion_calc(arr, n-1)
}
// (*arr)[n-1] = v
return v
}
func fibonacci_recursion_append(n int) []int64 {
if n == 1 {
return []int64{1}
}
if n == 2 {
return []int64{1, 1}
}
arr := fibonacci_recursion_append(n - 1)
return append(arr, arr[n-2]+arr[n-3])
}
func fibonacci_single_channel(n int) []int64 {
arr := make([]int64, n)
exit := make(chan bool)
cache := make(chan int, 220000)
go func() {
for i := 0; i < n; i++ {
cache <- i
}
exit <- true
}()
go func() {
for {
v := <-cache
if v == 0 {
arr[0] = 1
} else if v == 1 {
arr[1] = 1
} else {
arr[v] = arr[v-1] + arr[v-2]
}
}
}()
<-exit
return arr
}
func fibonacci_multiple_channel(n int) []int64 {
arr := make([]int64, n)
input := make(chan int64, 200)
a, b, output := make(chan int64, 200), make(chan int64, 200), make(chan int64, 200)
go func() {
input <- 1
input <- 1
<-a
for {
input <- <-a + <-b
}
}()
go func() {
for {
v := <-input
a <- v
b <- v
output <- v
}
}()
for i := 0; i < n; i++ {
arr[i] = <-output
}
return arr
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment