C 为什么我的输出在这个递归函数中是错误的?

C 为什么我的输出在这个递归函数中是错误的?,c,function,recursion,C,Function,Recursion,该函数只需使用(1+)或(2*)返回从数字x到数字y的最小过程。例如,从8到19,最小通行证为“3” 因为(8*2+1+1+1=19),现在我的代码输出的是一个不同的数字,而不是3,我的问题是什么 #include <stdio.h> int f(int x, int y){ if(x==y) return 0; if(x>y) return -1; if(2*x < y){ int max=f(2*x, y); retur

该函数只需使用(1+)或(2*)返回从数字x到数字y的最小过程。例如,从8到19,最小通行证为“3” 因为(8*2+1+1+1=19),现在我的代码输出的是一个不同的数字,而不是3,我的问题是什么

#include <stdio.h>
int f(int x, int y){

  if(x==y) 
    return 0;
  if(x>y)
    return -1;
  if(2*x < y){
    int max=f(2*x, y);
    return max+1;
  }
  else if(x+1<y){
    int max=f(x+1,y);
    return max+1;
  }
}

int main()
  {
    int idx=f(8,19);
    printf("%d", idx);

    return 0;
  }
#包括
整数f(整数x,整数y){
如果(x==y)
返回0;
如果(x>y)
返回-1;
如果(2*x
1.当
x
变为1小于
y
non时,将满足if条件,并且不会返回任何未定义的行为

从而取代

2.如果出现
if(2*x
,则不应添加
1+max
,以获得正确的结果,因为您只想计算完成的
+1
的数量

因此改变

int max=f(2*x,y);
返回最大值+1;

int max=f(2*x,y);
返回最大值;

添加所有代码后,将成为

int f(int x, int y){

  if(x==y)
    return 0;
  if(x>y)
    return -1;
  if(2*x < y){
    int max=f(2*x, y);
    return max;
  }
  else {
    int max=f(x+1,y);
    return max+1;
  }
}
intf(intx,inty){
如果(x==y)
返回0;
如果(x>y)
返回-1;
如果(2*x
在这种情况下,您应该考虑函数如何处理其变量。当它得到最后一次迭代时:

...
else if( x+1 < y ) {
    int max = f( x+1, y );
    return x+1;
}
...
。。。
否则如果(x+1
Kiran在这里是对的。对于x=8和y=19(正如你上面提到的),你会调用x=18的函数,它将返回undefined,因为没有一个if匹配

一个可能的解决办法是:

int f( int x, int y ) {

    if( x < y ) {

        if( x * 2 < y ) return f( x * 2, y );
        else if( x + 1 <= y ) return 1 + f( x + 1, y );

    } else if( x == y ) return 0;
    else return -1;

}
intf(intx,inty){
if(x否则如果(x+1这看起来像是调试器的作业!当我运行它时,它会打印22。请确保发布了正确的。请启用所有编译器警告,例如警告C4715:“f”:并非所有控制路径都返回值当x=18时,所有if测试都不会变为true@sam0101然后应该使用无符号整数,而不是有符号整数。警告C4715:“f”:不是全部控件路径返回一个值将
返回-1
放在函数的末尾,如果(x>y)
@jwdonahue是的,则删除
返回值。谢谢。@jwdonahue我认为没有必要在结尾处使用
返回-1
。我的编译器说,您的代码不会在所有路径上返回值。将
返回-1'放在末尾,这是最重要的“我们到了这里,有些东西是非常错误的声明”。这还包括
x>y`场景。我喜欢它!最不可能的角落案例是最后处理的,所有控制流路径都返回有意义的内容。我认为x和y应该是无符号的。无论哪种方式,都应该添加检查2*x溢出。
...
else if( x+1 < y ) {
    int max = f( x+1, y );
    return x+1;
}
...
int f( int x, int y ) {

    if( x < y ) {

        if( x * 2 < y ) return f( x * 2, y );
        else if( x + 1 <= y ) return 1 + f( x + 1, y );

    } else if( x == y ) return 0;
    else return -1;

}