算法(Java随笔)—递推&递归求解斐波拉契数列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40780805/article/details/82859240

递推算法——理性思维模式的代表,其原理是根据已有的数据和关系,逐步推导而得到结果。

算法的执行过程:

  1. 根据已知结果和关系,求解中间结果。
  2. 判定是否达到要求,未达到则继续重复第一步,直到寻找到正确答案。

递归算法——在程序中不断地反复调用自身来达到求解问题的方法,重点是调用自身

编写递归方法时,必须使用if语句强制方法在未执行递归调用之前返回,如果不这样做,它将永远不会返回(这很重要)。

从理论上说,所有的递归函数都可以转换为循环函数,然而代价通常都是比较高的。但递归是用栈机制实现的(c++),每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。

递归调用分两种情况:

  • 直接递归:就是指在方法调用方法本身。
  • 间接递归:指在另一个方法中调用递归方法(如前面提到的图的遍历),间接递归用的不多。

递推与递归的区别:

  1. 从程序上看,递归表现为自己调用自己,递推则没有这样的形式
  2. 一般来说,递推的效率高于递归
  3. 递归最终求得问题是逆向的,递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。

代码实现:

实例:斐波拉契数列(兔子产仔问题)——一对两个月大的兔子以后每个月可以产仔一对,新生兔两个月后又可以产仔,也就是说,一月份出生,三月份才可以产仔,假定兔子没有死亡,问n月后兔子的数量;

分析:

  • 第一个月:1对兔子;
  • 第二个月:1对兔子;
  • 第三个月:2对兔子;
  • 第四个月:3对兔子;
  • 第五个月:5对兔子;
  • 即从第三个月开始,每个月的兔子对树等于前两个月的兔子数的总和;

递推算法求解:

// 递推算法实例——斐波拉契数列——兔子产仔问题(1,1,2,3,5,8,13...)
	int diTui2(int n) {// n表示月份
		int temp1, temp2, tempn;
		temp1 = 1;// 两个月前的兔子对数
		temp2 = 1;// 一个月前的兔子对数
		tempn = 0;//n月的兔子对数
		for (int i = 3; i <= n; i++) {
			tempn = temp1 + temp2;
			temp1 = temp2;
			temp2 = tempn;
		}
		return tempn;
	}

递归算法求解:

// 递归算法实例——斐波拉契数列——兔子产仔问题(1,1,2,3,5,8,13...)
	int diTui(int n) {// n表示月份
		int temp1, temp2;
		if (n == 1 || n == 2) {
			return 1;
		} else {
			temp1 = diTui(n - 1);// 一个月前的兔子对数
			temp2 = diTui(n - 2);// 两个月前的兔子对数
			return temp1 + temp2;
		}
	}

//递归算法实例——阶乘问题——如5!(5的阶乘)=5x4x3x2x1=120;
	int  diGui(int n){
		if(n==1){
			return 1;
		}
		return n*diGui(n-1);
	}

猜你喜欢

转载自blog.csdn.net/qq_40780805/article/details/82859240