• 递归总结(附相关算法题目)


    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))
    

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

  • 相关阅读:
    9.1 正则介绍_grep上 9.2 grep中 9.3 grep下
    汉诺塔递归问题
    8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下
    8.6 管道符和作业控制 8.7/8.8 shell变量 8.9 环境变量配置文件
    8.1 shell介绍 8.2 命令历史 8.3 命令补全和别名 8.4 通配符 8.5 输入输出重定向
    socket中使用序列化传结构体
    C# get,set属性用法
    Log4Net如何将日志按不同类型写入多个文件中
    app.config文件的configation标签中加代码引起”配置系统未能初始化“
    WinForm下使用 log4net
  • 原文地址:https://www.cnblogs.com/Lance-WJ/p/13530083.html
Copyright © 2020-2023  润新知