我有一个搜索函数,它使用递归对数组 values[]
执行二分搜索,以获取 value
:
int recurseSearch(int value, int values[], int min, int max) {
if (value > values[max] || min > max) return 1;
int midpoint = (max+min)/2;
if (values[midpoint] > value)
//search in left
recurseSearch(value, values, min, midpoint);
else if (values[midpoint] < value)
//search in right
recurseSearch(value, values, midpoint, max);
else if (values[midpoint] == value)
return 0;
else
return 2;
return 3;
}
调用此函数的代码只需调用 recurseSearch(value,values, 0, n);
为了验证起见,我将 values[5]
设置为等于 {3, 11, 32, 54, 66}
,value
为为 3
(即应返回 0),n
因此为 5
。
所以这被调用:recurseSearch(3,values, 0, 5);
现在我希望它最终返回并打印 0
,因为 3
确实在数组中。调试后,一切进展顺利,直到 midpoint
为 0,因此 values[midpoint] == value
为 true,因此 return 0
线路应该运行。然而,实际发生的情况是它确实如此,但随后 comcontrol 显然移动到函数的末尾(关闭 }
),但随后又向上移动并运行 return 3;
在线(此处)21。
我无法理解为什么 return 0
语句不只是从函数中返回,以及为什么 return 3
根本不运行
注意这个问题可以通过删除 return 3;
行来解决,但这会导致 clang 提示,以及我正在使用的运行命令 (make
),致命地有嘶嘶声,我宁愿避免这种情况
最佳答案
我没有仔细查看您的代码,因此其中可能存在其他错误,但听起来您希望将最深递归调用的返回值一直向上传递给调用者。在这种情况下,您可以删除 return 3;
并简单地返回您正在进行的每个递归调用的值:
int recurseSearch(int value, int values[], int min, int max) {
if (value > values[max] || min > max) return 1;
int midpoint = (max+min)/2;
if (values[midpoint] > value)
//search in left
return recurseSearch(value, values, min, midpoint);
else if (values[midpoint] < value)
//search in right
return recurseSearch(value, values, midpoint, max);
else if (values[midpoint] == value)
return 0;
else
return 2;
}
按照您最初编写代码的方式,递归调用的返回值将被完全忽略,并且将执行 return 3;
语句。
关于C 递归函数不会返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36656472/