2017-07-07 103 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'。你期望什麼,不回答或發佈完整的代碼? –