为什么使用递归实现二进制插入时必须有默认返回值?

问题描述 投票:0回答:1

searchInsert 函数返回目标应基于值的索引。为什么它应该有这条线

return -1;
在下面的代码中?我想我在缩小 *nums 数组的范围时包含了所有可能的结果。我一评论,结果就出错了。

#include <stdio.h> #include<stdlib.h> int searchInsert(int* nums, int numsSize, int target) { int s = 0; int b = numsSize-1; //the special case in the first place if(target > nums[b]){ return numsSize; }; if(target <= nums[s]){ return 0; }; //do the main process return narrow(nums, s, b, target); } int middleF(int s, int b){ return (b+s)/2; } int narrow(int* nums, int s, int b, int target){ //set middle int middle = middleF(s,b); //easy conditon if(target == nums[middle]){ return middle; }; if(target == nums[s]){ return s; }; if(target == nums[b]){ return b; }; if(b-s == 1){ return s+1; }; //narrow if(target < nums[middle]){ return narrow(nums, s, middle, target); }; if(target > nums[middle]){ return narrow(nums, middle, b, target); }; return -1; } int main(){ int arr[] = {1,3,5,6}; //supposed to be 2 printf("%d",searchInsert(arr,4,5)); //supposed to be 1 printf("%d",searchInsert(arr,4,2)); //supposed to be 4 printf("%d",searchInsert(arr,4,7)); }
我尝试搜索是否必须有一个默认返回值,即使在 C 中编译时实际情况不会发生。但还没有找到有用的东西。

c if-statement recursion return
1个回答
0
投票
您收到错误消息,因为代码是使用编译器选项编译的

-Werror=return-type
这会导致编译器因错误而中断编译。正如您在 Godbolt 上看到的,它不需要

就可以工作

return -1;

https://godbolt.org/z/xd8srfdhc

并且根据

https://en.cppreference.com/w/c/language/return,它的定义明确:

如果函数的结果用于表达式中,则到达任何其他返回值函数的末尾都是未定义的行为(允许丢弃此类返回值)。

更好的解决方案是使用最后一个可能的返回值作为默认值:

#include <stdio.h> #include<stdlib.h> int searchInsert(int* nums, int numsSize, int target) { int s = 0; int b = numsSize-1; //the special case in the first place if(target > nums[b]){ return numsSize; }; if(target <= nums[s]){ return 0; }; //do the main process return narrow(nums, s, b, target); } int middleF(int s, int b){ return (b+s)/2; } int narrow(int* nums, int s, int b, int target){ //set middle int middle = middleF(s,b); //easy conditon if(target == nums[middle]){ return middle; }; if(target == nums[s]){ return s; }; if(target == nums[b]){ return b; }; if(b-s == 1){ return s+1; }; //narrow if(target < nums[middle]){ return narrow(nums, s, middle, target); }; return narrow(nums, middle, b, target); } int main(){ int arr[] = {1,3,5,6}; //supposed to be 2 printf("%d",searchInsert(arr,4,5)); //supposed to be 1 printf("%d",searchInsert(arr,4,2)); //supposed to be 4 printf("%d",searchInsert(arr,4,7)); }
    
© www.soinside.com 2019 - 2024. All rights reserved.