剑指Offer——10.斐波那切数列

题目1:求斐波那切数列的第n项

写一个函数,输入n,求斐波那切(Fibonacci)数列的第n项。斐波那切数列的定义如下:

算法思想:

采用递归算法可以解决上述问题。递归虽然有代码简洁的优点,但它同时也有显著的缺点。递归由于是函数调用自身,而函数调用是有时间和空间消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间。

本题虽然可以用递归解决,但有很严重的效率问题。每求出一项都需要递归求出前两项,导致重复的计算太多,算法的时间复杂度较高。

这里可以定义两个缓存变量firstItem、secondItem,将之前计算出来的数列保存起来,计算下一项时,就不需要再重新计算。首先将f(0)和f(1)分别赋给firstItem、secondItem,计算出f(2)之后,将f(1)和f(2)分别赋给firstItem、secondItem......以此类推,算出第n项。这种思想的算法复杂度为O(n)。

代码实现:

	public int fibonacci(int n) {
		if(n <= 0)
			return 0;
		if(n == 1)
			return 1;
		
		int firstItem = 0;
		int secondItem = 1;
		int nItem = 0;
		for(int i = 2; i <= n; i++) {
			nItem = firstItem + secondItem;
			firstItem = secondItem;
			secondItem = nItem;
		}
		
		return nItem;
	}

 

题目2:青蛙跳台阶问题

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级台阶总共有多少种跳法。

算法思想:

这是一个典型的斐波那契数列问题。

n为1时,有1种跳法;

n为2时,有2种跳法;

n为3时,有3种跳法;

n为4时,有5种跳法;

......

从n=3开始,其结果为前两个结果之和。以此类推,算出第n级青蛙有多少种跳法。

代码实现:

	public int fibonacci(int n) {
		if(n <= 0)
			return 0;
		if(n == 1)
			return 1;
		if(n == 2)
			return 2;
		
		int firstItem = 1;
		int secondItem = 2;
		int nItem = 0;
		for(int i = 3; i <= n; i++) {
			nItem = firstItem + secondItem;
			firstItem = secondItem;
			secondItem = nItem;
		}
		
		return nItem;
	}

 

你可能感兴趣的:(剑指Offer,斐波那切数列)