2017-07-07 70 views
0

这是我的代码:功能kepps(递归C)

int Binary (int* arr, unsigned int size, int num) 
{ 

    if (0 == size) 
    { 
     return -1; 
    } 
    if (1 == size) 
    { 
     if (arr[0] == num) 
     { 
      return 0; 
     }  
     return -1; 
    } 

    size/= 2; 
    if (num == arr[size]) 
    { 
     return size; 
    } 
    else 
    { 
     if (num < arr[size]) 
     { 
      Binary (arr, size, num); 
     } 
     else 
     { 
      Binary (&arr[size+1], size, num); 
     } 
    } 

    return -1; 
} 

它不工作。 当我调试它(​​试图搜索一个数组中出现的数字)时,我发现它进入了'return size'行,它应该这样做(旁边的问题是否有一种方法可以将行号放入代码..),但它继续前往最后一行并返回-1。 我怎么回来,它不会离开功能? 我第一次尝试不放弃任何回报,因为我不应该达到最后,但编译器说“控制达到非void函数结束”,所以我添加了最后一个返回,但显然它不是正确的事情..

由于

+0

这是不可能的说,因为你没有提到你正在使用的调试器的结果。但是很可能返回来自'if'的递归调用网站之一,并且调用之后的下一步是返回-1; – Gene

+0

'二进制(&arr [size + 1],size,num);'是错误的。 :E.g'int a [] = {11,22}; int index =二进制(a,2,33);''==>'size/= 2;':'size'变成'1' ==>'二进制(&arr [size + 1],size,num);' ==>'Binary(&arr [1 + 1],1,33);':'&arr [1 + 1]'超出界限。 – BLUEPIXY

回答

3

您应该返回递归调用

int Binary (int* arr, unsigned int size, int num) 
{ 

    if (0 == size) 
    { 
     return -1; 
    } 
    if (1 == size) 
    { 
     if (arr[0] == num) 
     { 
      return 0; 
     }  
     return -1; 
    } 

    size/= 2; 
    if (num == arr[size]) 
    { 
     return size; 
    } 
    else 
    { 
     if (num < arr[size]) 
     { 
      return Binary (arr, size, num); // Added return 
     } 
     else 
     { 
      return Binary (&arr[size+1], size, num); // Added return 
     } 
    } 
} 
+2

最好的选择是完全摆脱递归。如果这不是一个选项,出于未知原因,我会写入函数的最后一部分,以便预先准备指针和大小变量。然后在最后有递归调用的单个return语句。否则,我不会相信编译器会正确地优化此代码,这意味着它不会被内联。这意味着它将是一个缓慢的,越野车的混乱。 – Lundin

0

替换递归调用:

return Binary (arr, size, num); 
//^^^^^^ 

目前,你只是调用该函数,而忽略返回值。


但后来它一直要到最后一行returns -1

它实际上是父进入return -1

+0

downvote的任何理由? OP代码应该包含'return'。你期望什么,不回答或发布完整的代码? –