go语言之斐波那契数列的几种实现方法

go语言之斐波那契数列的几种实现方法

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)

在学习go语言基础的过程中,学习了斐波那契数列的几种实现方法,总的可以分为递归和非递归实现。本文按照用到的方法侧重点不同,现细分如下:

  • 递归实现
  • 递归实现改进
  • 数组递归实现
  • 闭包实现

递归实现

package main

import "fmt"

const LIM = 40

func main() {
    //result := 0
    //var array []int
    var array [LIM]int
    for i := 0; i < LIM; i++ {
        array[i] = fibonacci(i)
        //result = fibonacci(i)
        //array = append(array, result)
        //fmt.Printf("fibonacci(%d) is: %d\n", i, result)
    }
    fmt.Println(array)
}

func fibonacci(n int) (res int) {
    if n <= 1 {
        res = 1
    } else {
        res = fibonacci(n-1) + fibonacci(n-2)
    }
    return
}

递归实现改进

package main

import "fmt"

const LIM = 40

var fibs [LIM]uint64

func main() {
    //var result uint64 = 0
    var array [LIM]uint64
    for i := 0; i < LIM; i++ {
        array[i] = fibonacci(i)
        //result = fibonacci(i)
        //array = append(array, result)
        //fmt.Printf("fibonacci(%d) is: %d\n", i, result)
    }
    fmt.Println(array)
}

func fibonacci(n int) (res uint64) {
    // memoization: check if fibonacci(n) is already known in array:
    if fibs[n] != 0 {
        res = fibs[n]
        return
    }
    if n <= 1 {
        res = 1
    } else {
        res = fibonacci(n-1) + fibonacci(n-2)
    }
    fibs[n] = res
    return
}

数组递归实现

package main

import "fmt"

const LIM = 40

func main() {
    fmt.Println(fibarray(LIM))
}

func fibarray(term int) []int {
    farr := make([]int, term)
    farr[0], farr[1] = 1, 1

    for i:= 2; i < term; i++ {
        farr[i] = farr[i-1] + farr[i-2]
    }
    return farr
}

闭包实现

package main

import "fmt"

const LIM = 40

func main() {
    f := fibonacci() //返回一个闭包函数
    var array [LIM]int
    for i := 0; i < LIM; i++ {
        array[i] = f()
    }
    fmt.Println(array)
}

func fibonacci() func() int {
    back1, back2 := 0, 1
    return func() int {
        // 重新赋值
        back1, back2 = back2, (back1 + back2)
        return back1
    }
}

小结

总体来说,用time包可以测试几种实现方法所用时间,对比得出递归实现会比闭包实现耗时更长,效率远远低于非递归实现。

参考链接:
https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/examples/

你可能感兴趣的:(go语言之斐波那契数列的几种实现方法)