第七关|理解递归

1、递归特征

1、执行时范围不断缩小,这样才能触底反弹。

举例:

  1. 阶乘:f(n) = n * f(n-1)
  2. 斐波那契:f(n) = f(n-1) + f(n-2)
  3. int leftDepth = getDepth(node.left); // 左                                                                                       int rightDepth = getDepth(node.right)//右

以上:1.和2.的n在不断缩小;3.的范围缩小到左子树和右子树

2、终止判断在调用递归的前面。

在执行递归之前,一定会有一个终止条件。不然一直递归下去,直到栈溢出,抛出异常。

一个方法的递归调用可以多次,加一些逻辑处理。

public void recursion(参数0) {
    if (终止条件) {
        return;
    }
    //可能有一些逻辑运算1
    recursion(参数1);
    // 可能有一些逻辑运算2
    recursion(参数2);
    // ......3
    recursion(参数n);
    // 可能有一些逻辑运算
}

2、递归过程

  1. 找递归公式
    1. 从小到大找规律,可以先选几个较小的值验一下,再选几个较大的值验一下。
    2. 斐波那契数列:1、1、2、3、5、8、13、21….,即第一项 f(1) = 1,第二项 f(2) = 1…..,从第三项开始就满足:f(n) = f(n-1) + f(n-2)这就是我们要找的递归公式。
  2. 分情况确定终止条件
    1. 阶乘:当 n = 1 时,f(1) = 1。
    2. 有时候终止条件不止一个,斐波那契数列的递归公式f(n) = f(n-1) + f(n-2)里,如果n=2时会出现f(2)=f(1)+f(0),因为没有f(0),是从f(1)开始的,所以要将n==2也给限制住,所以结束条件:当 n <= 2 时,return 1;
    3. 有些情况不一定触底才反弹,而是达到某种要求就停止,这样需要考虑的情况会比较多。可以枚举,将可能的情况列举一下然后优化。
  3. 组合出完整条件
    1.  递归公式+终止条件

    2. 举例:斐波那契
int fibonacci(int n){
    // 1.先写终止条件
    if(n <= 2){
        return 1;
    }
    // 2.再写递归公式
    return fibonacci(n-1) + fibonacci(n - 2);
}

3、递归实例

例:第2关链表反转的递归法

题目+代码链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值