递归
递归的三大要素
-
第一要素:明确函数想要干什么
首先需要明确,这个函数的功能是什么,需要完成什么事情
例如,计算n的阶乘,那么函数为
// 算 n 的阶乘(假设n不为0) int f(int n){ }
-
第二要素:寻找递归结束的条件
递归就是在函数内部的代码里面,调用自己的本身,那么需要有一个结束的条件,来结束无止境调用自己。
即参数为XXX时,递归结束,把结果返回,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。
例如计算n的阶乘,可以知道n=1时,结果为1,因此:
// 算 n 的阶乘(假设n不为0) int f(int n){ if(n == 1){ return 1; } }
注意,这个条件,需要考虑到鲁棒性,考虑为0等特殊情况。
-
第三要素:找出函数的等价关系式
我们要不断缩小参数的范围,缩小之后,我们可以通过一些辅助的变量或者操作,使原函数的结果不变。
例如,f(n) 这个范围比较大,我们可以让 f(n) = n * f(n-1)。这样,范围就由 n 变成了 n-1 了,范围变小了,并且为了原函数f(n) 不变,我们需要让 f(n-1) 乘以 n。
说白了,就是要找到原函数的一个等价关系式,f(n) 的等价关系式为 n * f(n-1),即
f(n) = n * f(n-1)。
即
// 算 n 的阶乘(假设n不为0) int f(int n){ if(n <= 2){ return n; } // 把 f(n) 的等价操作写进去 return f(n-1) * n; }
其他:
- 如果找不出规律,可以先将其带入尝试一遍。
- 多尝试一些递归的经典题目:反转链表、青蛙台阶