【数据结构于算法分析】递归算法的运行流程
来源:互联网 发布:编程教程 编辑:程序博客网 时间:2024/06/06 01:03
从前学习算法分析的时候,我想不通递归算法的运行流程
比如,在顺序语句之中出现了对本方法的递归调用时,我不清楚到底应该接着向下运行,还是应该以这次调用为新的起点从头再来,如果是后者,是否就意味着,递归调用每一次都应该从【底】开始分析,直至分析了《数据结构与算法分析》中的一段代码。
问题:最大子序列和问题
样本:A[ ] = {4,-3,5,-2,-1,2,6,2 }
- int MaxSubSequence(const int A[],int N)
- {
- return MaxSubSum(A,0,N-1);
- }
- static int MaxSubSum(const int A[], int Left, int Right)
- {
- int MaxLeftSum,MaxRightSum;
- int MaxLeftBorderSum,MaxRightBorderSum;
- int LeftBorderSum,RightBorderSum;
- int Center,i;
- if(Left == Right)
- {
- if(A[Left] > 0)
- return A[Left];
- else
- return 0;
- }
- Center = (Left + Right)/2;
- MaxLeftSum = MaxSubSequence(A,Left,Center);
- MaxRightSum = MaxSubSequence(A,Center+1,Right);
- MaxLeftBorderSum = 0;
- LeftBorderSum = 0;
- for(i = Center;i >= Left;i--)
- {
- LeftBorderSum += A[i];
- if(LeftBorderSum > MaxLeftBorderSum)
- MaxLeftBorderSum = LeftBorderSum;
- }
- MaxRightBorderSum = 0;
- RightBorderSum = 0;
- for(i = Center+1;i <= Right;i++)
- {
- RightBorderSum += A[i];
- if(RightBorderSum > MaxRightBorderSum)
- MaxRightBorderSum = RightBorderSum;
- }
- return Max(MaxLeftSum,MaxRightSum,MaxLeftBorderSum + MaxRightBorderSum);
- }
13-19行的代码是分析的关键,它的存在就是为了解决递归调用至【底】的后续问题。本题中,按照21-23行的流程向下调用时,以left为例,最【底 - 1】部的 lfet = right = 0,此时再将数据传入调用时,就符合了13-19行的条件,于是有了第一个return的结果,返回给【底 - 1】次调用,循环往复。
以及,13-19行的类似代码是递归调用的一个简单特征。
阅读全文
0 0
- 【数据结构于算法分析】递归算法的运行流程
- 数据结构:递归 算法分析
- Java数据结构与算法分析《七》递归的高级应用
- (c#)数据结构与算法分析 --递归
- 数据结构与算法分析笔记:第一章:递归
- java数据结构与算法分析之递归
- Java数据结构与算法分析《六》递归
- 数据结构与算法分析 2.17 给出有效的算法(及其运行时间分析)
- 数据结构与算法分析(一) —— 深入理解递归算法的调用过程
- 递归算法的复杂度分析
- 算法分析--汉诺塔的递归
- 递归与非递归算法的分析
- 《数据结构》递归算法
- 《数据结构》递归算法
- 《数据结构》递归算法
- 《数据结构》递归算法
- Java数据结构---递归算法
- 数据结构JAVA---递归算法
- Jenkins搭建Egret H5开发的自动化构建(持续集成)
- PC版车牌识别在机器人中的使用
- Java学习第五天
- Dubbo hellword
- 暑假day1
- 【数据结构于算法分析】递归算法的运行流程
- linux rpm安装mysql
- Nginx学习——Nginx基本配置
- 在ubuntu上安装,使用MQTT Mosquitto
- POI中文API文档
- Java字符串小结
- 贪心加排序
- 565. Array Nesting(dfs 血的教训)
- 作为Scala语法糖的设计模式