首页 > 其他分享 >递归法求解最大连续子序列和MaxSubSum

递归法求解最大连续子序列和MaxSubSum

时间:2024-03-23 09:58:05浏览次数:22  
标签:right 递归 求解 max sum MaxSubSum mid 序列 left

何为递归

  • 总结一句话就是:向基准情形不断推进
    核心就在于 “递”“归”
    递:不断推进
    归:向基准情形
  • 结合今天的例子进一步解释如下:
    分而治之的思想 divide and conquer
    分三步:“分”“治”“合并”
    “分”:
    将子序列看作三种,左半部分 右半部分 跨越中间元素的子序列
    “治”:
    左右两部分利用递归寻找最大子序列和,跨越中点的最大子序列和(即在左半部分开始,右半部分结束)
    “合并”
    将得到的三个结果取max就得到了想要的结果

求解最大子序列和

求解一个最大子序列和,有三种情况,在讨论之前我们先规定中间元素简称为mid。这三种情况是:
1、子序列在mid左边
2、子序列在mid右边
3、子序列跨越mid
那么求解子序列和与递归法有什么关系呢
首先我们来看一个图解:
在这里插入图片描述

在这个问题中,
基准情形是:
当序列中只有一个元素时,最大子序列和就是它本身
逐渐推进体现在:
数据规模一直在减半,在减半的过程中,序列元素个数不断减少,到最后一层就是基准情形。
综上: 该问题满足像基本情形不断推进,因此可以用该思路写递归算法
在这里插入图片描述

出现过的报错:RecursionError: maximum recursion depth exceeded in comparison

在这里插入图片描述

写代码小tips

ctrl+r快捷键替换:
在这里插入图片描述
![在这里插入图片描述](/i/ll/?i=direct/dbffd746f8e8465d8c99d8043ba9cb7d.png

代码如下

def maxsubsum(nums,left,right):
    #基准情形 序列中只有一个元素,那么它就是最大的
    if left==right:
        return nums[left]
    mid=(left+right)//2#一定要注意这里加法要加括号!!!血泪教训,会陷入死循环
    #递归:分别对左边的序列和右边的序列运行maxsubsum函数,序列中不包含mid对应的元素
    maxleftsum = maxsubsum(nums,left,mid)
    maxrightsum = maxsubsum(nums,mid+1,right)
    #跨越中间元素的子序列和,分别求出左边最大和右边最大,加和即为结果
    left_all_sum=0
    max_left_all_sum=0
    left_index=mid
    while left_index>=left:
        left_all_sum+=nums[left_index]
        if left_all_sum>max_left_all_sum:
            max_left_all_sum =left_all_sum
        left_index-=1

    right_all_sum = 0
    max_right_all_sum = 0
    right_index = mid+1
    while right_index <= right:
        right_all_sum += nums[right_index]
        if right_all_sum > max_right_all_sum:
            max_right_all_sum = right_all_sum
        right_index += 1

    return max(maxleftsum,maxrightsum,max_left_all_sum+max_right_all_sum )

s=[-1,7,8,-4,999]
left=0
right=len(s)-1
print(maxsubsum(s,left,right))

根据给出的例子输出结果如下
在这里插入图片描述

标签:right,递归,求解,max,sum,MaxSubSum,mid,序列,left
From: https://blog.csdn.net/2301_78696436/article/details/136951512

相关文章

  • SQL语句的递归查询
        在银行的统计分析任务中,往往是需要查询本行及其下级行、下级行的支行等各机构各自的运营情况,入参可以能是总行,也可能是一级行或二级行甚至支行,如果针对每种情况都各种写一个查询语句,工作量过于繁杂,但用了递归查询,就可以一劳永逸了;  下面介绍一下递归查询的格式......
  • 【VRP问题】基于粒子群算法求解带时间窗的路径最短多车辆多任务车辆路径规划CTWVRP问
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 最大化运输问题求解——Python实现
    运输问题(TransportationProblem)是运筹学中的经典问题,通常涉及将资源从供应点转移到需求点,以最小化运输成本或满足需求。这个问题在各种实际场景中都有广泛的应用,包括但不限于以下几个方面:供应链管理:在供应链中,最小化运输问题可用于确定最有效的货物运输方式,以满足各个节点之间的......
  • 2023年华数杯国际大学生数学建模竞赛B题社会稳定预警研究求解全过程文档及程序
    2023年华数杯国际大学生数学建模竞赛B题社会稳定预警研究原题再现  人类和所有动物一样,都有趋利避害的本能。人类成为造物之主的关键是,他们比其他动物更善于避免伤害。危机总是潜伏在未来。人类发展史是一部不断超越危机的历史(严耀军,2003)。“居安思危”,衡量和警示社会......
  • 汉诺塔问题-递归问题-JAVA实现
    什么是汉诺塔?汉诺塔(河内塔)(TowerofHanoi)是根据一个传说形成的数学问题:常见玩具版汉诺塔有8个圆盘          3个圆盘的汉诺塔的移动          4个圆盘的汉诺塔的移动由此变成一个数学问题有三根杆子A,B,C。A杆上有N个(N>1)穿......
  • list转树状结构 非递归 多个顶级节点 通用工具类
    有时候,需要返给前端需要的树状结构数据。需要后端转换组装。做了个通用工具类,非递归方式,简单易用。上代码:树结构类:packagecom.ruoyi.shop;importlombok.Data;importjava.util.List;/***返回前端树结构*@Authorwql*@Date2024/3/219:36*/@Datapubl......
  • PINN物理信息网络 | 物理信息神经网络求解麦克斯韦方程
    物理信息神经网络(PINN)求解麦克斯韦方程的研究背景源于对复杂电磁现象描述与计算的挑战以及对神经网络在物理问题求解中潜力的探索。麦克斯韦方程组是英国物理学家詹姆斯·克拉克·麦克斯韦在19世纪建立的一组描述电场、磁场与电荷密度、电流密度之间关系的偏微分方程。这组......
  • 如何理解递归算法?
     首先说说递归思想,我认为可以从以下三点进行把握:将大问题分解为有限个子问题;每个子问题的求解方式相同;存在已知的最小子问题,作为“归”的条件。 一句话解释:递归思想是将大问题分解为数个求解方式相同的子问题,且该问题具有已知的最小子问题。 另外,递归是分为两个......
  • 代码随想录第14天|二叉树的递归遍历
    二叉树的理论基础代码随想录(programmercarl.com)关于二叉树,你该了解这些!|二叉树理论基础一网打尽,二叉树的种类、二叉树的存储方式、二叉树节点定义、二叉树的遍历顺序_哔哩哔哩_bilibili二叉搜索树:二叉搜索树是一个有序树。左子树不为空,则左子树上所有节点的值均小于根......
  • Java递归拷贝文件夹
    importjava.io.*;importjava.util.Scanner;publicclassDemo{publicstaticvoidmain(String[]args){FilesrcDirFile=getDirFile("输入源文件夹路径");FiledestDirFile=getDirFile("输入目标路径");if(srcDirFile.e......