【问题标题】:Segmentation fault in recursive Binary Search Algorithm in CC中递归二进制搜索算法中的分段错误
【发布时间】:2013-07-24 18:06:59
【问题描述】:

这是一个带有递归二分查找算法的 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);    
     }
}

谢谢你:)

【问题讨论】:

  • 你知道 seqfaulting 到底在哪里吗?能否尝试将最后一个条件移到函数顶部,看看是否修复?
  • 函数怎么调用? 哪里 崩溃(在哪一行)?你能显示调试器的回溯吗?
  • 您不能确保低实际上低于高。为此添加一个测试。
  • @KarthikT 非常感谢,它成功了 :)
  • @MichaelFerashireSilva 太棒了!不客气!

标签: c arrays recursion binary-search


【解决方案1】:

您必须在val &lt; ...val &gt; ... 之前检查low == high,否则high 可能会小于low,因此您的下一次递归可能会计算出无效的mid

【讨论】:

  • 如果low > high 首先是什么
  • @mathk 我认为这是对binSearch() 的无效调用,因此在函数的文档中要求low &lt;= high 就足够了。当然,如果您愿意,您可以先检查一下。
  • 这是基本的安全检查。永远不要相信输入。
【解决方案2】:

您的边缘情况已关闭:具体而言,当您的 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;
}

【讨论】:

    【解决方案3】:

    试试这个:

    修复了代码中的 if 构造

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

    【讨论】:

      【解决方案4】:

      low high 不能保证。如果不是这种情况,您将在数组范围之外进行搜索。

      为此添加健全性检查。

      if (low < high)
           return -1;
      

      编辑:正如其他指出的那样,您还可以在开始时检查 low == high 但这并不能确保函数的第一次调用具有合理的价值。

      【讨论】:

        猜你喜欢
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-15
        • 2020-09-06
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        相关资源
        最近更新 更多