斐波那契数列的迭代算法和递归算法

斐波那契数列:1、1、2、3、5、8、13......

使用迭代算法和递归算法都可以实现斐波那契数列,输出数列中的第N项,但是由于递归算法在计算时存在着大量的重复计算,所以在N值很大时,可能会造成内存的溢出,以及计算时间较长的情况出现,在使用迭代算法的情况下同样可以实现计算斐波那契数列第N项的功能,代码示例如下

迭代算法:

public static int FibonacciD(int num) {
		if(num <= 0) {
			return 0;
		}
		if(num == 1 || num == 2) {
			return 1;
		}
		int first = 1,second =1,third = 0;
		for(int i = 3; i<= num ;i++) {
			third = first + second;
			first = second;
			second = third;
		}
		return third;
	}

思路就是当 n <=0 时 return 0,当1 <= n <= 2时 return 1 ,当 n >= 3时,第n项 f(n) = f(n-2) + f(n-1),所以在计算数列中第n项的时候可用一个for循环,初始化前两项的值,计算完成第N项之后,然后交换(n-2)项 (n-1)项的值,循环完成之后计算出的Third值即为数列中第N项的值

递归算法:

public static int Fibonacci(int i) {
		if(i <= 0) {
			return 0;
		}
		if(i == 1 || i == 2) {
			return 1;
		}
		return Fibonacci(i -2) + Fibonacci(i-1);
	}

在N值比较小的时候两种方式计算耗时的差异不大,但是当N值比较大的时候两者之间计算时间的差异就比较大了,

当N = 10 ,运行时间差异不大,基本上一致

当N = 40 时,此时运行耗时差异已经比较大了

 当N = 45 时,耗时差异进一步加大

所以当N 值趋近于一个较大的值时,再使用递归计算第N项值,耗费的时间将是一个很恐怖的值,因此当N值较大时优先使用迭代算法

猜你喜欢

转载自blog.csdn.net/sun_jinhang/article/details/88395958