伴学终生 发表于 2023-8-6 11:38:48

代码上的一点小问题

int a={0,5,6,8,10,13,18,22,26,27,29,30,36,58,59,87};

void search(int x,int y,int num){
    int index = (x+y)/2;
    if(a==num){a=index;   return; }
    if(x==y)    return;
    if(a>num)    search(x,index,num);
    else if(a<num) search(index,y,num);
}

int main(){
    search(1,15,60);
    if(a!=0){
      printf("%d,在第%d个!\n",a],a);
    }
    else{
      printf("查无此数!\n");
    }
}

这段在查找成功的时侯可以成功输出,但是在查找失败却输出失败,求大佬们解答!

学习编程中的Ben 发表于 2023-8-6 11:39:01

问题解答:

你提供的代码中存在两个问题导致查找失败时也会输出失败的情况:

1. 当查找失败时,应该在递归的最后一步进行输出失败的操作。你可以通过在 search() 函数中添加一个 else 条件来实现,在所有的判断条件都不满足时输出失败。

2. 在查找成功后,由于 a 被设定为了查找到的索引值,因此在输出结果时需要使用 a] 来查找实际的数值。

以下是修改后的完整代码:

++#include <stdio.h>

int a = {0, 5, 6, 8, 10, 13, 18, 22, 26, 27, 29, 30, 36, 58, 59, 87};

void search(int x, int y, int num) {
    int index = (x + y) / 2;

    if (a == num) {
      a = index;
      return;
    }

    if (x == y)
      return;

    if (a > num)
      search(x, index, num);
    else if (a < num)
      search(index, y, num);
    else
      printf("查无此数!\n");
}

int main() {
    search(1, 15, 60);

    if (a != 0) {
      printf("%d,在第%d个!\n", a], a);
    }
    else {
      printf("查无此数!\n");
    }

    return 0;
}


修改后的代码会在查找失败时输出 "查无此数!"。希望这能解决你的问题,如有任何其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-8-6 11:39:01

问题出在搜索函数的递归调用上。在搜索函数中,当a>num时,应该递归调用search函数时将y参数设为index-1,而不是y参数设为index。同样地,当a<num时,应该递归调用search函数时将x参数设为index+1,而不是x参数设为index。

以下是修改后的代码:

#include <stdio.h>

int a={0,5,6,8,10,13,18,22,26,27,29,30,36,58,59,87};

void search(int x, int y, int num){
    int index = (x+y)/2;
    if(a == num){
      a = index;
      return;
    }
    if(x == y)
      return;
    if(a > num)
      search(x, index-1, num);
    else if(a < num)
      search(index+1, y, num);
}

int main(){
    search(1, 15, 60);
    if(a != 0){
      printf("%d,在第%d个!\n", a], a);
    }
    else{
      printf("查无此数!\n");
    }
    return 0;
}


这样修改后,当查找失败时会正确输出"查无此数!"。

Mike_python小 发表于 2023-8-6 11:39:05

在这段代码中,查找失败时输出失败的问题出在对边界条件的处理上。当x==y时,也就是在查找范围缩小到只有一个元素时,你没有正确地处理这种情况,导致没有返回结果。

你可以修改search函数中的边界条件判断部分来解决这个问题。修改后的代码如下:


#include <stdio.h>

int a = {0, 5, 6, 8, 10, 13, 18, 22, 26, 27, 29, 30, 36, 58, 59, 87};

void search(int x, int y, int num){
    int index = (x + y) / 2;
   
    if(a == num){
      a = index;
      return;
    }
   
    if(x > y)
      return;
   
    if(a > num)
      search(x, index - 1, num); // 修改为 index - 1
    else if(a < num)
      search(index + 1, y, num); // 修改为 index + 1
}

int main(){
    search(1, 15, 60);
   
    if(a != 0){
      printf("%d 在第 %d 个!\n", a], a);
    }
    else{
      printf("查无此数!\n");
    }
   
    return 0;
}


在这段代码中,我对边界条件判断部分进行了修改。如果x超过y时,表示已经查找完整个范围,但没有找到目标数字,此时应该返回。在递归调用search函数时,对index进行加减操作来调整查找范围。

重新运行修改后的代码后,查找失败时会正确输出"查无此数!"。希望这个解答能够帮到你!如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 代码上的一点小问题