递归总结(附相关算法题目)
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
算法二:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1
和 0
。
示例 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))
注意:我这里画蛇添足了,可以直接操纵二进制进行加法递归,当然,本质是为了了解递归,光论时间复杂度的话递归绝对不是最好的解决方式