首页 > 编程语言 >递归算法

递归算法

时间:2023-04-01 16:14:34浏览次数:26  
标签:right return 递归 nums sum 算法 left

递归算法

 

递归算法是一种通过调用自身来解决问题的算法。递归算法通常涉及到将一个问题划分为较小的子问题来解决,并在子问题中调用自身来完成。

递归算法的基本思想是,将一个大问题转化为一个或多个相同结构的小问题,直到问题变得足够小以便直接解决。然后将这些小问题的解组合成原始问题的解。在递归算法中,一个函数通过调用自身来解决一个问题,直到问题的规模变得足够小,以至于函数可以直接解决它,这个过程被称为递归。

递归算法可以用于各种不同的问题,如搜索、排序、树和图的遍历等等。递归算法的优点是,它可以使代码更简单和易于理解,并且可以处理复杂的问题,因为它可以将问题分解为更小的、易于处理的子问题。然而,递归算法也有一些缺点,如可能会占用大量的堆栈空间、效率较低等问题,需要根据实际情况进行权衡。

 

应用

递归算法可以用于各种不同的问题,如搜索、排序、树和图的遍历、分治法等等。以下是一些递归算法的应用示例:

1.阶乘计算

递归算法可以用于计算阶乘,如下所示:

 

1 def factorial(n):
2     if n == 0:
3         return 1
4     else:
5         return n * factorial(n-1)

 

2.斐波那契数列

递归算法可以用于计算斐波那契数列,如下所示:

def fibonacci(n):
    if n == 0 or n == 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)
3.二叉树遍历
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def preorderTraversal(root: TreeNode) -> List[int]:
    if not root:
        return []
    else:
        return [root.val] + preorderTraversal(root.left) + preorderTraversal(root.right)
4.分治法
def maxSubArray(nums):
    def divide_conquer(nums, left, right):
        if left == right:
            return nums[left]
        mid = (left + right) // 2
        left_sum = divide_conquer(nums, left, mid)
        right_sum = divide_conquer(nums, mid+1, right)
        cross_sum = find_cross_sum(nums, left, right, mid)
        return max(left_sum, right_sum, cross_sum)
    def find_cross_sum(nums, left, right, mid):
        left_sum = float('-inf')
        curr_sum = 0
        for i in range(mid, left-1, -1):
            curr_sum += nums[i]
            left_sum = max(left_sum, curr_sum)
        right_sum = float('-inf')
        curr_sum = 0
        for i in range(mid+1, right+1):
            curr_sum += nums[i]
            right_sum = max(right_sum, curr_sum)
        return left_sum + right_sum
    return divide_conquer(nums, 0, len(nums)-1)

以上就是递归的基本应用

接下来会有几个力扣练习题来帮助大家练习

练习题1

力扣509 斐波那契数列

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

 

class Solution:
    def fib(self, n: int) -> int:
        if n < 2:
            return 0 if n==0 else 1
        m =self.fib(n - 1) +self.fib(n - 2)
        return m

练习题二

力扣的206反转链表:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

 

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head
        p =self.reverseList(head.next)
        head.next.next=head
        head.next=None
        return p

 

 

练习题三

力扣的344:反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

 

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """

        left = 0
        right = len(s) - 1
        while(left < right):
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        return s

 

标签:right,return,递归,nums,sum,算法,left
From: https://www.cnblogs.com/cjxs0/p/17278756.html

相关文章

  • 算法导论-第1章-算法在计算中的作用
    第1章算法在计算中的作用1.1算法(Algorithms)非形式地说,算法(algorithm)是任何明确定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或某个值的集合作为输出。因此算法就是将输入转换为输出的一系列计算步骤。Informally,analgorithmisanywell-definedcomputa......
  • 算法导论-第2章-算法基础
    第2章算法基础2.1插入排序(Insertionsort)输入:\(n\)个数的序列\(<a_1,a_2,\cdots,a_n>\)输出:输入序列的一个排列\(<a_1^{'},a_2^{'},\cdots,a_n^{'}>\),满足\(a_1^{'}\lea_2^{'}\le\cdots\lea_n^{'}\)被排序的数称为关键字。在本书中,使用伪代码(pseudoc......
  • VBA 对象数组排序算法分享
     FunctionSrotObjectByProperty(objsToSortAsVariant,PropertyNameAsString,Optional降序AsBoolean=True)IfIsEmpty(objsToSort)ThenExitFunctionIfInStr(TypeName(objsToSort),"()")<1ThenExitFunction'IsArray()issom......
  • 算法笔记之并查集
    一、并查集的定义并查集是一种树型的数据结构,用于处理一些不相交集合(disjointsets)的合并及查询问题。常常在使用中以森林来表示。并查集,顾名思义,支持以下两种操作操作:并(Union):把两个不相交的集合合并为一个集合。查(Find):查询两个元素是否在同一个集合中。二、并查......
  • 递归实现排列型枚举
    #include<iostream>usingnamespacestd;constintN=10;intn;intstate[N];boolused[N];voiddfs(intu){if(u==n+1){for(inti=1;i<=n;i++){cout<<state[i]<<"";}cout<<end......
  • 基于凸集上投影(POCS)的聚类算法
    POCS:ProjectionsontoConvexSets。在数学中,凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点,可以通过找到该点在该凸集合上的投影来进行操作。该投影是离该点最近的凸集内的点,可以通过最小......
  • 【LBLD】小而美的算法技巧:前缀和数组
    【LBLD】小而美的算法技巧:前缀和数组一维数组中的前缀和classNumArray{private:vector<int>preSum;public:NumArray(vector<int>&nums){preSum.push_back(0);for(inti=1;i<nums.size()+1;i++){preSum.push_back(......
  • mp雪花算法生成的id到前端丢失精度问题
    mp生成的id是Long型18位,但是js处理到16位就四舍五入了,解决办法就是在服务器转成字符串传给前端  WebMvcConfig要继承WebMvcConfigurationSupport,重写里面的extendMessageConverters方法@OverrideprotectedvoidextendMessageConverters(List<HttpMessageConv......
  • 基于matlab的高精度信号峰值检测算法
    1.算法描述       峰值检验是示波表中数据采集方式之一,这种技术起源于存储深度不能满足捕获毛刺的需要。如果用模拟示波器去观察,只有当毛刺信号是重复性的并且和主信号同步时,才能看到毛刺信号。由于毛刺源于其他电路系统,所以这些毛刺只是偶尔发生,并且和主信号......
  • m基于PID控制算法的四旋翼无人机飞行控制simulink仿真
    1.算法描述  无人机采用常见的四旋翼无人飞行器,如图1所示。           PID控制器,即控制器的控制方式为P比例调整,I积分调整以及D微分调整三个部分构成,PID控制器是目前为止应用最为广泛的控制方式。PID控制器具有结构简单,性能稳定,参数设置简单等优势。PID控制......