关于C\C++递归
关于一般的递归我明白程序怎么运行,比如一般的那个斐波那契递归。我也看过《C和指针》中函数那一章的递归,可我看《数据结构与算法分析-c语言描述》讲最大子序列和的递归算法我就看不懂了。程序如下,相信很多人都看过了。(我用C++实现的)
#include <iostream>
using namespace std;
int maxyz(int x, int y, int z)
{
int a=-1000;
if(x>a)
a=x;
if(y>a)
a=y;
if(z>a)
a=z;
return a;
}
int MaxSubSum(const int A[],int left, int right)\\这个才是主要的
{
//cout << left<< endl;
//cout << right<< endl;
int MaxLeftBorderSum,LeftBorderSum,MaxRightBorderSum,RightBorderSum,center,i,MaxLeftSum,MaxRightSum;
if(left==right)
if(A[left]>0)
{
// cout << "0000"<< endl;
return A[left];
}
else
{
// cout << "1111"<< endl;
return 0;
}
center=(left+right)/2;
//cout << "center is "<<center<< endl;
MaxLeftSum=MaxSubSum(A,left,center);
//cout << "2222"<< endl;
MaxRightSum=MaxSubSum(A,center+1,right);
//cout << "3333"<< endl;
MaxLeftBorderSum=0;
LeftBorderSum=0;
for (i=center;i>=left;i--)
{
LeftBorderSum=LeftBorderSum+A[i];
//cout << "left is "<< left<<endl;
//cout << i<< endl;
if (LeftBorderSum>MaxLeftBorderSum)
MaxLeftBorderSum =LeftBorderSum;
}
MaxRightBorderSum=0;
RightBorderSum=0;
for (i=center+1;i<=right;i++)
{
RightBorderSum=RightBorderSum+A[i];
//cout << "right is "<<right<< endl;
//cout << i<< endl;
if (RightBorderSum>MaxRightBorderSum)
MaxRightBorderSum =RightBorderSum;
}
return maxyz(MaxLeftSum,MaxRightSum,MaxRightBorderSum+MaxLeftBorderSum);
}
int main()
{
int const A[]={1,2,4,-2,3,-4,5,2,-9,3,-2,-1};
int a=MaxSubSum(A,0,11);
cout << "max number is " <<a<< endl;
return 0;
}
和原始程序有差异的地方是我加了很多cout 方便我追踪程序(我不会单步调试)。我也追到了程序的过程,但是我还是很不懂,尤其是:
MaxLeftSum=MaxSubSum(A,left,center);
MaxRightSum=MaxSubSum(A,center+1,right);
第二行的这句程序,它第一次运行的时候,那个center和right是什么时候的谁的center和right?
这第二行程序运行的时候,它会再把第一行重新运行一遍吗?以及这两行程序后面的那些程序又是如何运行的?假如你觉得我给的例子数组太长,你可以换个短的。
求稍微详细一点的解释! 先谢啦!!!! c++ c 递归
[解决办法]
VS下:
F10 F11
[解决办法]
这样或许你就能看清是哪一个调用的了。
#include <iostream>
#include <string>
using namespace std;
void Recursive(string order, int num)
{
cout<<order
<<num
<<"
[解决办法]
";
if (num == 0)
{
cout<<endl;
return;
}
else
{
Recursive("1st ", num-1);
Recursive("2nd ", num-1);
}
}
void main()
{
Recursive("org ", 3);
}