C 奇数递归失败

C 奇数递归失败,c,recursion,C,Recursion,我刚刚写了这个函数来打印一个列表,其中的数字介于a和b之间 void list(int a, int b){ if(a == b){ printf("%d", a); }else{ if(a < b){ printf("%d ", a); printf("%d ", b); list(a + 1, b - 1); } if(b < a){

我刚刚写了这个函数来打印一个列表,其中的数字介于
a
b
之间

void list(int a, int b){

  if(a == b){
    printf("%d", a);
  }else{
    if(a < b){
      printf("%d ", a);
      printf("%d ", b);
      list(a + 1, b - 1);
    }
    if(b < a){
      printf("%d ", a);
      printf("%d ", b);
      list(a - 1, b + 1);
    }
  }

}
它工作正常并打印:
2837465
。但在这种情况下:

int main(){

  list(2, 7);

  return 0;
}
它永远打印出
273645454545454…


函数中有什么错误???

因为每次进行迭代时,您都在
a
b
中减去/添加1。这意味着当它是奇数时,
a
b
对数将永远不会相同。我建议您在开始学习基本算法(特别是递归算法)时,在纸上尝试一些迭代

编辑:建议只添加一个退出子句(另一个else if),如果
A
大于
b
(或者反之,根据哪个数字更高,可以将其保存为布尔值),则退出递归

2736445

当a=4,b=5时,下一个是a=5,b=4,这样就得到了循环

试试这个:

void list(int a, int b){ 
  if ( ( b-a ) % 2  == 0 ){ // even
    if(a == b){
    printf("%d", a);
  }else{
  if(a < b){
    printf("%d ", a);
    printf("%d ", b);
    list(a + 1, b - 1);
  }// if
    else if(b < a){
      printf("%d ", a);
      printf("%d ", b);
      list(a - 1, b + 1);
    }
  }
}
else { // odd
  if(a < b){
    printf("%d ", a);
    printf("%d ", b);
    list(a + 1, b - 1);
  }  // if
 }
}
void列表(inta,intb){
如果((b-a)%2==0){//偶数
如果(a==b){
printf(“%d”,a);
}否则{
if(a
这是因为它永远不会结束。当a和b之间的差值为奇数时,它们永远不会达到==条件,并且会一直持续下去。要解决这个问题,你可以检查a和b是否会通过,比如:

void list(int a, int b)
{
    if(a == b)
        printf("%d", a);

    else if(a < b)
    {
        printf("%d ", a);
        printf("%d ", b);
        
        if (a + 1 != b)
            list(a + 1, b - 1);
    }

    else if(b < a)
    {
        printf("%d ", a);
        printf("%d ", b);
        
        if (b + 1 != a)
            list(a - 1, b + 1);
    }
}
无效列表(内部a、内部b)
{
如果(a==b)
printf(“%d”,a);
否则如果(a
当a不等于b时,每一轮都要增加一个(a或b),减少另一个。因此,数字之间的差值现在减少2(或增加2)。简单的观察表明,对于重新调用函数的终止,数字(a,b)必须相等。因此,如果差值为0(a=b,这将不会再次调用函数),则a和b之间的差值应为2的倍数。因此,只有偶数和奇数都是可以接受的。在其他情况下,函数将被一次又一次地调用,并且特定的序列将重复(在您的案例中为4 5 4)

很明显,如果两个数字都是奇数或偶数,它们将变为相等,但如果一个是奇数,另一个是偶数,它们将不相等地相互传递。例如,如果它们是
4
5
,则它们变成
5
4
void list(int a, int b)
{
    if(a == b)
        printf("%d", a);

    else if(a < b)
    {
        printf("%d ", a);
        printf("%d ", b);
        
        if (a + 1 != b)
            list(a + 1, b - 1);
    }

    else if(b < a)
    {
        printf("%d ", a);
        printf("%d ", b);
        
        if (b + 1 != a)
            list(a - 1, b + 1);
    }
}