C语言Day6学习笔记
函数的递归思想
1、递归的概念:
递归作为一种算法在程序设计语言中广泛应用,是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。递归算法的实质将原来的问题转化为更小的同一问题,然后递归调用方法来表示问题的解。
2、递归的要素:
明确递归的终止条件
提取重复的逻辑,缩小问题的规模不断递去
给出递归终止时的处理办法
例(一个典型的递归函数):
int eatPeach(int day) { // 递归终止的条件 if (day == 1) { return 1; } // 递归操作 return 2 * (eatPeach(day - 1) + 1); }
3、我对于对于递归的理解:递归的思想说白了就是把大事化小,小事化了。在我们遇到的问题中,往往有一类问题是对于一个大的问题,我们可以把它划分为一些子问题,这些子问题往往可以通过不断的重复递去,然后到达一个最原始的子问题,通过把这个过程再次归还回来,就可以解决原本的问题,也就是说,我们在运用递归思想解决这一类问题时,首先要明确一个重复的做法,也就是缩小问题,再通过条件的约束,让他结束重复,然后进行返回,一步一步解决问题。
下面给出用递归思想计算阶乘的办法
// 求n的阶乘 int f(int n) { // 递归终止的条件 if (n == 1) { return 1; } // 递归操作 return n * f(n - 1); }
除此之外,还可以用递归思想解决一个著名的问题——斐波那契数列
但是在程序运行时,发现在用递归思想解决该问题时,常规的计算中会出现多次重复计算,导致程序运行速度大打折扣,降低了性能,甚至在计算后面的某一项时,会出现程序崩溃的情况,该问题的解决方案如下
int arr[50] = {0}; // 声明数组,用来保存计算结果的 int fib(int n) { if (n==1 || n==2) { // 递归终止的条件 return 1; } if (arr[n]==0) { // 如果没有计算,就进行计算并保存计算结果 arr[n] = fib(n - 1) + fib(n - 2);// 将原问题转化为较小的同一问题 } return arr[n]; }
实际的解决办法就是,定义一个数组,用来保存已经计算好的结果,在下次计算时就不用重复计算了