C 如何修复-控件可能达到非无效函数的末尾
我在cs50课上遇到问题,我不得不写二进制搜索函数。 当尝试运行代码时,会出现以下消息:控件可能到达非void函数的末尾。我试图通过在最后一行添加returnfalse来修复,但这会使输出始终为false。请给我一些提示 这是我的密码:C 如何修复-控件可能达到非无效函数的末尾,c,cs50,C,Cs50,我在cs50课上遇到问题,我不得不写二进制搜索函数。 当尝试运行代码时,会出现以下消息:控件可能到达非void函数的末尾。我试图通过在最后一行添加returnfalse来修复,但这会使输出始终为false。请给我一些提示 这是我的密码: bool search_r(int value, int values[], int l, int r) { int v = values[(l + r) / 2]; int right = r; int left = l; if
bool search_r(int value, int values[], int l, int r) {
int v = values[(l + r) / 2];
int right = r;
int left = l;
if ((l + r) / 2 > 0) {
if (v == value) {
return true;
} else
if (v > value) {
right = ((l + r) / 2);
search_r(value, values, left, right);
} else
if (v < value) {
left = ((l + r) / 2);
search_r(value, values, left, right);
}
} else {
return false;
}
}
最后一个else是不必要的,如果您只返回false,它将完全满足您的需要。但是您可能应该在if分支中返回true。或者使函数完全不返回,因为您没有使用返回值,如果返回值始终为false,那么它就没有多大用处。考虑这样一种情况,即if条件不满足,并且程序完成时没有给出返回值。现在由于else条件,这是不可能的。但是编译器不知道这一点,因此希望确保该函数返回一个值,因为它是一个非void函数。 删除else条件并简单地添加
return false;
程序结束时将解决问题。您的函数有几个问题: 必须从递归调用返回值以进行搜索。此错误导致警告,因为函数在嵌套的if语句之后没有return语句。使其返回为假;结尾处的值不正确,因为如果找到该值,递归调用应返回true。 如果l或r非常大,l+r/2可能会溢出。在这种情况下,结果是不正确的。计算中间指数的正确方法是l+r-l/2。 终止测试不是l+r/2>0,它只测试中间索引是否大于0。改为使用l
bool search_r(int value, int values[], int left, int right) {
if (left < right) {
int middle = left + (right - left) / 2;
int v = values[middle];
if (v == value) {
return true;
} else
if (v > value) {
return search_r(value, values, left, middle);
} else {
return search_r(value, values, middle + 1, right);
}
} else {
return false;
}
}
你的职能:
bool search_r(int value, int values[], int left, int right)
指示将返回布尔值。我认为@chqrlie对此有很好的回应
您应该返回一个默认值,该值不受任何循环或条件的影响,以防不满足这些条件。它将完全相同并使错误消失:就像mithilesh的回答一样,这将修复警告,但不会修复算法缺陷。对于数组中的所有值,该函数都将返回false,但只有一个值。@chqrlie也许你是对的。我没有关注函数的功能,只是警告的原因。您不返回递归结果的任何原因?或者您可能正在寻找。这将修复警告,但不会修复算法缺陷。该函数将为数组中除单个值以外的所有值返回false。
bool found = search_r(value, array, 0, length);
bool search_r(int value, int values[], int left, int right)