zoukankan      html  css  js  c++  java
  • 递归总结(附相关算法题目)

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

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

  • 相关阅读:
    Spring框架之 我对AOP的理解
    第二次分班考试之 ---纠错19/25题
    Spring IOC(控制反转) 和DI
    一级缓存,二级缓存
    多对多连接
    MyBatis 智能标签
    小结javaScriptOOP的对象内容点
    15年错题小结2月
    《Java周边》Http请求模拟工具(postman)
    《Java周边》IDEA 设置快捷键和快捷键中英文对照
  • 原文地址:https://www.cnblogs.com/Lance-WJ/p/13530083.html
Copyright © 2011-2022 走看看