上课老师讲到递归,发现自己有些遗忘,或者就是根本不会,只是对这个名字熟悉罢了,我就开始搜集资料进行恶补。
以下是自己对递归的理解,仅是个人理解,若有错误,还请批评指正。
首先我们要明白什么是递归?
递归无非就是自己调用自己,可能对小白来说比较抽象(我也是小白),可以简单理解为套娃?无限套娃?
其实理解这个问题是比较简单的,我们只需要三步走就行
1、明确函数的作用
2、寻找递归结束的条件
3、找出函数的等价关系
我们直接上题目来给大家解释:
对于递归,阶乘是经典题目之一,现在我们就来按照三步走的方法来解题
第一步:明确函数的作用
// 算 n 的阶乘(假设n不为0)
int f(int n){
}
第二步:寻找递归结束的条件
对于阶乘我们在纸上算起来大家还是很明白的,
若n等于1,n的阶乘等于1;
若n等于2,n的阶乘等于2;
所以我们就找到了递归结束的条件;
如果(n==1),返回1。
// 算 n 的阶乘(假设n不为0)
int f(int n){
if(n == 1){
return 1;
}
}
第三步:找出函数的等价关系
第三步也是递归当中最难理解的一步,需要好好理解。
例如我们要求5!,其实5!=5*4!。这样看起来也就比较好理解了,也就找到了函数的等价关系,因为我们知道,
4!不就是f(4)嘛,然后函数调用,4的阶乘不就等于4*3!嘛,然后套娃开始,调用调用,当然我们就要找到结束的条件,实际上这在第二步我们就写出来了,当n=1时,返回值1,这样一来一个求阶乘的递归函数就写好了。
// 算 n 的阶乘(假设n不为0)
int f(int n){
if(n <= 2){
return n;
}
// 把 f(n) 的等价操作写进去
return f(n-1) * n;
}
接下来我们来一道青蛙跳台阶,也是一道比较基础的经典题目。
分析这道题其实也不难,我们还是按照三步走的方法来手把手教大家解题:
第一步:明确函数的作用
这道题是要求跳上n个台阶有多少种跳法,定义一个函数就行。
看懂题目定义函数是第一步
第二步:寻找递归结束的条件
我们来想,青蛙上一个台阶有几种跳法?答案是一种,就是上一个台阶这一种方法,那我们也就找到了递归结束的条件代码如下:
第三步:找出函数的等价关系
假设青蛙在第n个台阶上,那么它是从哪里跳上来的呢?
可能是第(n-1)个台阶跳上一步,
也可能是第(n-2)个台阶跳上两步。
话不多说,上代码:
class Solution {
public:
int jumpFloor(int number) {
if(number<=1) return 1;
return jumpFloor(number-1)+jumpFloor(number-2);
}
};