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