斐波那契数列的递归和非递归实现

斐波那契数列:
0,1,1,2,3,5,8,13,21 …
分析数列可以得出第n列的值等于前两列的值相加的结果。
它的数学公式为:F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2),(n>=2)

求第n列的斐波那契值的方法:

  1. 用递归方式(时间复杂度O(2^N)):
func fibo(n int) int {
	if n <= 0 {
		return 0
	} else if n == 1 {
		return 1
	} else {
		return fibo(n-1) + fibo(n-2)
	}
}

这种方式易于理解但是效率很低,因为求n列的时候必须先得出n-1和n-2列的值,而n-1列的值又是由前两列的值相加得出,很多值都会重复计算。这种重复计算会随着n的增加成几何倍增长。
在这里插入图片描述
2. 非递归实现(时间复杂度O(N),空间复杂度O(N))
定义一个数组,从第2列开始,每列的值都等于前两列的值相加。

// fibonacci 非递归实现,借助数组
func fibonacci(n int) int {
	if n <= 0 {
		return 0
	} else if n == 1 {
		return 1
	} else {
		arr := make([]int, n+1)
		arr[0] = 0
		arr[1] = 1
		for i := 2; i <= n; i++ {
			arr[i] = arr[i-1] + arr[i-2]
		}
		fmt.Println(arr)
		return arr[n]
	}
}
  1. 非递归实现(时间复杂度O(N),空间复杂度O(1))
// fibonacci2 用变量保存两个要加的值
func fibonacci2(n int) int {
	if n <= 0 {
		return 0
	} else if n == 1 {
		return 1
	} else {
		first := 0
		second := 1
		res := 1
		for i := 2; i <= n; i++ {
			res = first + second
			first = second
			second = res
		}
		return res
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值