小白能看懂的递归总结

1,递归是什么?

递归就是程序反复调用自身。

2.如果我们选择使用递归,那么就要充分相信这个函数的功能就实现了这个功能,不要去纠结他的自身的下一层函数又做了什么,这样的话就会觉得实现一个递归解法会十分的复杂,根本没有办法下手。

3.用递归的的三个步骤\

a.寻找递归的终止条件:递归应该在什么时候结束

b.本级递归需要做什么:在这一级的递归中应该完成什么任务

c.找返回值:应该给上一级返回什么信息。

再强调一遍:在使用递归的过程中要充分相信这个函数的功能,坚信调用这个函数就能得到你想得到的值,不要去纠结他的每一层的实现。

4.实战演练

下面我们就用递归的思想去解决几道链表的题,另外树的深度优先搜索也是用递归实现,后续我们再补充一下树的相关题目。(所有的题目均来自于leetcode,所有题目的实现语言都用C++)

(1)leetcode 83题:从有序链表中删除重复节点

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // 1.寻找递归结束条件
        if (head == NULL || head->next == NULL) {
            return head;
        }
        // 思考本层递归该干什么:本层递归就是实现删除重复节点
        head->next = deleteDuplicates(head->next);
         // 3.思考应该给上一级返回什么:如果本节点和下一个节点的值相等,说明是重复的节点,我们就要向上一级返回下一个节点
        return head->val == head->next->val ? head->next : head;
    }
};

(2)leetcode 21题:归并两个有序的链表

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // 1. 寻找递归结束条件
        if (l1 == NULL) {
            return l2;
        }
        if (l2 == NULL) {
            return l1;
        }
         // 2. 本层递归要什么:本层递归就要要通过判断l1和l2当前节点值的大小合并两个两个链表的当前节点
        if (l1->val < l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            //3. 返回值:思考要向上级返回什么,要返回就是已经把当前节点合并的链表
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }

    }
};

 

你可能感兴趣的:(算法思想总结)