如果数字为负,为啥在递归解决方案中找到给定序列中的最大子序列的基本情况返回 0?

Posted

技术标签:

【中文标题】如果数字为负,为啥在递归解决方案中找到给定序列中的最大子序列的基本情况返回 0?【英文标题】:Why does the base case in recursive solution to find the maximum subsequence in a given sequence return 0 if the number is negative?如果数字为负,为什么在递归解决方案中找到给定序列中的最大子序列的基本情况返回 0? 【发布时间】:2014-09-02 22:02:38 【问题描述】:

以下是使用递归编写的 C++ 示例代码,用于解决最大子序列问题 - 不完全是子序列,而是最大子序列的总和。

int maxSumRec( const vector<int> & a, int left, int right )

  if( left == right ) // Base case
    if( a[ left]>0)
      return a[ left ];
    else
      return 0;

  int center = ( left + right ) / 2;
  int maxLeftSum = maxSumRec( a, left, center );
  int maxRightSum = maxSumRec( a, center + 1, right );
  int maxLeftBorderSum = 0, leftBorderSum = 0;
  for( int i = center; i >= left; --i )
  
    leftBorderSum += a[ i ];
    if( leftBorderSum > maxLeftBorderSum )
      maxLeftBorderSum = leftBorderSum;
  
  int maxRightBorderSum = 0, rightBorderSum = 0;
  for( int j = center + 1; j <= right; ++j )
  
    rightBorderSum += a[ j ];
    if( rightBorderSum > maxRightBorderSum )
      maxRightBorderSum = rightBorderSum;
  
  return max3( maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum );

如果剩下的单个元素是负数,为什么基本情况必须返回 0?如果我们返回更高的值 0 而不是实际的负值,它不会影响总和吗?我在互联网上搜索了基本案例的解释和问题陈述,但找不到解释。

【问题讨论】:

你的意思是最大子数组还是子序列?他们都是不同的。您的代码似乎找到了子数组 【参考方案1】:

空序列x的子序列,其和为0。序列x之和为x,如果x为负数,显然小于0。

【讨论】:

以上是关于如果数字为负,为啥在递归解决方案中找到给定序列中的最大子序列的基本情况返回 0?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在号码为 001 时看到错误?请查看下面的代码以从给定数字中找到最大回文数[重复]

树递归 - 打印给定数字的子序列

找数字(递归,二分查找)

为啥在给定文本行中的数字时 IsNumeric() 返回 False

基于递归的折半查找

这个递归是如何工作的?