首页 > 技术文章 > 递归总结(附相关算法题目)

Lance-WJ 2020-08-19 16:28 原文

1、什么是递归

  递归无外乎两个过程,递推和回溯,首先需要定义一个结束点,然后从外部不听回溯缩小规模,直到到达结束点停止回溯,然后反向通过return递推再慢慢扩大返回规模最后得到我们想要的过程,相比之下递归法是比较简单的,只需要保证有个结束点,而且需要注意return递推的是同一种东西,否则会关联一些非所需结果的东西导致递推过程失败。

2、为什么要用递归

  优点:缩小规模,代码简洁,容易理解,递归保存每次递归调用当前状态,允许函数获得子问题的结果后继续处理。

  缺点:消耗时间过多,时间复杂度爆炸。

3、怎么用递归

算法一:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

代码如下

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if not l1: return l2  # 终止条件,直到两个链表都空
        if not l2: return l1
        if l1.val <= l2.val:  # 递归调用
            l1.next = self.mergeTwoLists(l1.next,l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1,l2.next)
            return l2

算法二:

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 10

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

代码如下:

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        def data(info):
            num = 0
            for i in range(1, len(info) + 1):
                num += int(info[-i]) * (2 ** (i - 1))
            return num

        def result_info(sum):
            if sum == 0 or sum == 1:
                return str(sum)
            a, b = divmod(sum, 2)
            return result_info(a) + str(b)

        num1 = data(a)
        num2 = data(b)
        sum = num1 + num2
        return str(result_info(sum))

注意:我这里画蛇添足了,可以直接操纵二进制进行加法递归,当然,本质是为了了解递归,光论时间复杂度的话递归绝对不是最好的解决方式

推荐阅读