【数据结构于算法分析】递归算法的运行流程

来源:互联网 发布:编程教程 编辑:程序博客网 时间:2024/06/06 01:03

从前学习算法分析的时候,我想不通递归算法的运行流程


比如,在顺序语句之中出现了对本方法的递归调用时,我不清楚到底应该接着向下运行,还是应该以这次调用为新的起点从头再来,如果是后者,是否就意味着,递归调用每一次都应该从【底】开始分析,直至分析了《数据结构与算法分析》中的一段代码。


问题:最大子序列和问题

样本:A[ ] = {4,-3,5,-2,-1,2,6,2 }

  1. int MaxSubSequence(const int A[],int N)  
  2. {  
  3.     return MaxSubSum(A,0,N-1);  
  4. }  
  5.   
  6. static int MaxSubSum(const int A[], int Left, int Right)  
  7. {  
  8.     int MaxLeftSum,MaxRightSum;  
  9.     int MaxLeftBorderSum,MaxRightBorderSum;  
  10.     int LeftBorderSum,RightBorderSum;  
  11.     int Center,i;  
  12.       
  13.     if(Left == Right)  
  14.     {  
  15.         if(A[Left] > 0)  
  16.             return A[Left];  
  17.         else  
  18.             return 0;  
  19.     }  
  20.       
  21.     Center = (Left + Right)/2;  
  22.     MaxLeftSum = MaxSubSequence(A,Left,Center);  
  23.     MaxRightSum = MaxSubSequence(A,Center+1,Right);  
  24.       
  25.     MaxLeftBorderSum = 0;  
  26.     LeftBorderSum = 0;  
  27.     for(i = Center;i >= Left;i--)  
  28.     {  
  29.         LeftBorderSum += A[i];  
  30.         if(LeftBorderSum > MaxLeftBorderSum)  
  31.             MaxLeftBorderSum = LeftBorderSum;  
  32.     }  
  33.       
  34.     MaxRightBorderSum = 0;  
  35.     RightBorderSum = 0;  
  36.     for(i = Center+1;i <= Right;i++)  
  37.     {  
  38.         RightBorderSum += A[i];  
  39.         if(RightBorderSum > MaxRightBorderSum)  
  40.             MaxRightBorderSum = RightBorderSum;  
  41.     }     
  42.       
  43.     return Max(MaxLeftSum,MaxRightSum,MaxLeftBorderSum + MaxRightBorderSum);  
  44. }   


13-19行的代码是分析的关键,它的存在就是为了解决递归调用至【底】的后续问题。本题中,按照21-23行的流程向下调用时,以left为例,最【底 - 1】部的 lfet = right = 0,此时再将数据传入调用时,就符合了13-19行的条件,于是有了第一个return的结果,返回给【底 - 1】次调用,循环往复。


以及,13-19行的类似代码是递归调用的一个简单特征。

原创粉丝点击