递归总结

递归三大要素

第一要素:明确这个函数想要干什么

这个函数的功能是什么,不管代码怎么实现,先明确这个函数是用来干什么的。

第二要素:寻找递归结束条件

我们需要找出当参数为啥时,递归结束,然后返回结果。我们必须更具这个参数的值,能够知道函数的结果是什么。

第三要素:找出函数的等价关系式

我们要不断缩小参数的范围,搜小之后,我们可以通过一些辅助的变量或操作,使原函数的结果不变。

案例1:斐波那契数列
int f(int n) {
    if(n <= 2)
        return n;
    return f(n-1) + f(n-2);
}
案例2:青蛙跳台阶
int f(int n) {
    if(n <= 2)
        return n;
    return f(n-1) + f(n-2);
}
案例3:反转单链表
class Node {
    int data;
    Node next;
}
Node reverseList(Node head) {
    if(head == null || head.next == null)
        return head;
    Node newNode = new Node();
    newNode = reverseList(head.next);
    
    head.next.next = head;
    head.next = null;
    return newNode;
}

递归优化思路

1、考虑是否重复计算

把中间的计算结果保存起来,下次进行计算时,判断是否计算过,如果计算过,直接取出来使用就行了,没有计算过,再递归计算。

2、考虑是否可以自底向上

当n比较大时,从上往下递归可能会导致栈空间不太够用,这种情况可以考虑自底向上的做法,也叫做递推。

全部评论

相关推荐

28小凳也想实习:项目不用一个业务一个轮子吗,刷牛客好多人说要一业务一轮子
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务