Day 7:斐波那契数列

时间:2022-07-24
本文章向大家介绍Day 7:斐波那契数列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——斐波那契数列

题目描述:

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体思路:

概念介绍   斐波那契数列是一个很经典的问题,大多学计算机的都知道,它是由著名数学家列昂纳多·斐波那契而命名的。它也称之为黄金分割数列。它的由来是从兔子的繁殖而引进来的,因此也称之为“兔子数列”。从第三项起,前两项之和即为第三项,其通项为F(n) = F(n - 1)+ F(n - 2).例如:这样的一个数列:1 1 2 3 5 8 13 21 34……就是斐波那契数列。 实现思路   实现斐波那契数列需要进行经典的算法——递归。但是递归也是有技巧,如果我们只是单纯的进行递归,不进行任何的优化,则时间和空间复杂度为指数级别的,随着n的不断增长,时间的消耗和空间呈爆炸型增长。因此即使我们用递归也要对通项进行优化。其实在计算过程中,我们不难发现,前两项这和为第三项,之所以直接递归有那么大的复杂度,是因为它每计算新的一项,总会重复计算前一项,因此,我们只需要定义一个新的变量来保存这个之前计算好的值,时间和空间复杂度就降下来了。 我们分别用java和python来实现这个思路。 1、我们首先用java来实现这个代码

public class Solution{
	public int Fibonacci(int n){
		if (n <= 1){
			return n;
		}
			int res = 0;
			int n1 = 0;
			int n2 = 1;
			for(int i = 2; i <= n; i++){
				res = (n1 + n2);
				n1 = n2;
				n2 = res;
			}
				return res;
	}
}

代码效果图如图所示:

2、我们用Python来实现

class Solution:
	def Fibonacci(self, n):
		a = 0
		b = 1
		for i in range(n):
			a, b = b ,a + b
		return a

其效果图如图所示:

  我们可以通过改善一下以上的代码,适当的缩减代码的运行时间复杂度,当然,空间就比之前的要占用多了,这就是典型的“以空间换时间”的思想。具体改进代码如下:

class Solution:
	def Fibonacci(self, n):
		a, b = 0, 1
		for i in range(n):
			a, b = b, a + b
		return a

其效果图如图所示:

  与上面的代码相比较,只是优化了一行代码,时间复杂度确降低了接近一半,当然与之对应的空间就扩大了将近一倍。

总结

  本道题通过一个典型的斐波那契数列问题来考察我们对递归的应用,因此在做该题之前,我们应该了解斐波那契数列,其次要熟练掌握递归思想。在最后我们运用了常见的“以空间换时间”的思想来改进了算法,其效果很明显。继续加油,争取早日找到工作,Good Luck!!!