void print1(int num[],int l,int r)
{
if(l==r)
{
return;
}
cout << r<< endl;
cout << l<< endl;
int mid=l+(r-l)>>1;
//cout << << endl;
cout << mid<< endl;
//print1(num,l,mid);
print1(num,mid+1,r);
// sort1(num,l,mid,r);
}
在你的代码中,递归函数 print1 的结束条件是当 l 等于 r 时返回,但是你在每次调用 print1 的时候都将右边界 r 和左边界 l 都输出了一次,这样会导致在 l 和 r 相等的情况下无法结束递归,进而造成死循环。
你可以将 cout 语句放到递归调用之前或之后,或者使用其他的调试手段(如打印日志或使用断点)来验证程序的正确性和调试问题。
另外,注意在计算 mid 时,应该加上括号,否则可能会导致运算优先级错误,例如应该写成 int mid=l+((r-l)>>1); 来确保 + 运算在 >> 运算之前执行。
改为:
if(l>=r)
return;
mid的计算结果可能导致mid+1会大于r的啊
在您的递归函数中,mid 的计算可能有问题。根据运算符优先级,+ 操作符的优先级高于 >> 操作符,所以表达式 l+(r-l)>>1 实际上等于 l+((r-l)>>1),也就是 l+floor((r-l)/2)。如果您的意图是想计算 (l+r)/2,应该使用 l+(r-l)/2 或者 (l+r)>>1。
因此,您可以尝试修改代码为:
void print1(int num[],int l,int r)
{
if(l==r)
{
return;
}
cout << r << endl;
cout << l << endl;
int mid = (l + r) / 2;
cout << mid << endl;
print1(num, l, mid);
print1(num, mid + 1, r);
// sort1(num,l,mid,r);
}
这样,函数将会先递归处理左子数组,然后再递归处理右子数组,最终达到终止条件退出循环。
修正后的代码应该是这样的:
void print1(int num[], int l, int r)
{
if (l == r) {
return;
}
cout << r << endl;
cout << l << endl;
int mid = l + (r - l) >> 1;
cout << mid << endl;
print1(num, l, mid);
print1(num, mid + 1, r);
sort1(num, l, mid, r);
}
注意,在实际使用中,还需要保证传递给 print1() 函数的参数 l 和 r 的值是正确的,否则也会导致无限递归或者其他问题。
建议善用断点逐步调试,以后遇到类似的问题也能自己解决