簡體   English   中英

C語言中遞歸二進制搜索算法中的分割錯誤

[英]Segmentation fault in recursive Binary Search Algorithm in C

這是一個具有遞歸二進制搜索算法的C程序,但是當我運行它時,調試器說二進制搜索功能中存在訪問分段錯誤。 為什么會這樣,我該如何解決?

這是遞歸二進制搜索功能:

int binSearch(int val, int numbers[], int low, int high)                 
{
     int mid;

     mid=(low+high)/2;
     if(val==numbers[mid])
     {  
                return(mid);          
     }   
     else if(val<numbers[mid])
     {
                return(binSearch(val, numbers, low, mid-1));               
     }            
     else if(val>numbers[mid])
     { 
                return(binSearch(val, numbers, mid+1, high));  
     }    
     else if(low==high)
     {
                return(-1);    
     }
}

謝謝 :)

您必須在val < ...val > ...之前檢查low == high ,因為否則high可能變得小於low ,因此您的下一個遞歸可能會計算出無效的mid

您的極端情況不對:特別是,當您的lowhigh指數通過時,您會在達到low == high測試之前繼續遞歸調用。 重新安排測試:

int binSearch(int val, int numbers[], int low, int high) {
    int mid = (low + high) / 2;

    if (val == numbers[mid]) return mid;

    if (val < numbers[mid]) {
        if (mid > low) return binSearch(val, numbers, low, mid-1);
    } else if (val > numbers[mid]) {
        if (mid < high) return binSearch(val, numbers, mid+1, high);
    }
    return -1;
}

嘗試這個:

修復代碼中的構造

int binSearch(int val, int numbers[], int low, int high)                 
{
     int mid;

     mid=(low+high)/2;

     if(low<=high)
     {
         if(val==numbers[mid])
           return mid;          

         else if(val<numbers[mid])
           return binSearch(val, numbers, low, mid-1);

        else 
          return binSearch(val, numbers, mid+1, high);  
     }
     else
           return -1;    

}

low < high不確定。 如果不是這種情況,您將要搜索數組邊界之外的內容。

為此添加完整性檢查。

if (low < high)
     return -1;

編輯:正如其他指出的那樣,您還可以在開始時檢查低==高,但是不能確保函數的第一次調用具有聲音值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM