为什么递归函数一直在循环

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);
}

这样,函数将会先递归处理左子数组,然后再递归处理右子数组,最终达到终止条件退出循环。

在你的代码中,递归函数 print1() 中,你注释掉了其中一个递归调用语句 print1(num,l,mid),因此只有一次递归调用 print1(num,mid+1,r)。这导致在递归时只对右半边进行了拆分,而没有对左半边进行拆分,从而导致递归函数无限循环在右半边。

为了修复这个问题,你需要将递归调用 print1(num,l,mid) 取消注释。这样可以将数组拆分为左半边和右半边并对其进行递归处理。此外,还需要将调用 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 的值是正确的,否则也会导致无限递归或者其他问题。

建议善用断点逐步调试,以后遇到类似的问题也能自己解决