go语言实现--斐波那契数列的3种方法

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)(百度百科)

用文字来说,就是费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出。

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……

特别指出:0不是第一项,而是第零项。

本次代码有3种实现方式

1)递归

2)迭代

3)闭包

代码如下:

package main

import "fmt"

func main() {
	n := 7
	i := Fibo1(n)
	j := Fibo2(n)
	k := Fibo3(n)
	fmt.Printf("%v  %v  %v", i, j, k)
}

//递归实现
func Fibo1(n int) int {
	if n == 0 {
		return 0
	} else if n == 1 {
		return 1
	} else if n > 1 {
		return Fibo1(n-1) + Fibo1(n-2)
	} else {
		return -1
	}
}

//迭代实现
func Fibo2(n int) int {
	if n < 0 {
		return -1
	} else if n == 0 {
		return 0
	} else if n <= 2 {
		return 1
	} else {
		a, b := 1, 1
		result := 0
		for i := 3; i <= n; i++ {
			result = a + b
			a, b = b, result
		}
		return result
	}
}

//利用闭包
func Fibo3(n int) int {
	if n < 0 {
		return -1
	} else {
		f := Fibonacci()
		result := 0
		for i := 0; i < n; i++ {
			result = f()
		}
		return result
	}
}

func Fibonacci() func() int {
	a, b := 0, 1
	return func() int {
		a, b = b, a+b
		return a
	}
}


简单的测试用例代码如下:

package main

import "testing"

var testArr = []int{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89}

func TestFibo1(t *testing.T) {
	for i, v := range testArr {
		if actual := Fibo1(i); actual != v {
			t.Errorf("Fibo1(%v): got %v, expected %v\n", i, actual, v)
		}
	}
}

func TestFibo2(t *testing.T) {
	for i, v := range testArr {
		if actual := Fibo2(i); actual != v {
			t.Errorf("Fibo2(%v): got %v, expected %v\n", i, actual, v)
		}
	}
}

func TestFibo3(t *testing.T) {
	for i, v := range testArr {
		if actual := Fibo3(i); actual != v {
			t.Errorf("Fibo3(%v): got %v, expected %v\n", i, actual, v)
		}
	}
}

猜你喜欢

转载自blog.csdn.net/tuobicui6522/article/details/80397918