我正在尝试创建一个递归函数,该函数将在输入到函数中的特定点之后返回数组的最小值。
这需要递归地完成而不使用循环。
这是我到目前为止所拥有的:
a.or(b).flip()
我不确定自己在做什么错,我可以寻求帮助。
答案 0 :(得分:2)
mid
从未更新。
幸运的是,代码“可以”与测试用例一起使用。
这需要递归地完成而不使用循环。
当然不需要递归来查找最小值int
。
尽管称为mid
,但findMinpos(arr, mid, len-1)
表示代码将调用findMinpos()
N次(N是原始数组元素数),并且产生递归深度O(N)。
这种线性使用递归,给递归一个坏名字。
相反,将每个findMinpos
呼叫的问题减半。
int findMinpos_alt(int arr[], int len){
assert(len > 0);
if(len == 1 ) {
return arr[0];
}
int left_len = len/2
int left_min = findMinpos_alt(arr, left_len);
int right_min = findMinpos_alt(arr + left_len, len - left_len);
return left_min < right_min ? left_min : right_min;
}
这将调用函数N次,但递归深度为O(log(N))。
将使用更高级的代码
int findMinpos_alt2(const int arr[], size_t len);
答案 1 :(得分:1)
我怀疑这是教导如何解决Divide and Conquer问题的家庭作业。这将一个问题分解为两个更简单的子问题,然后递归解决。通常对排序和搜索很有用。
仅在列表中找到最小的元素是过大的,它是O(nlogn),其中一个简单的循环将是O(n),但这是在教技术。我希望。
在这种情况下,您可以通过将数组分成两半来找到数组的最小元素,找到这些两半的最小元素,然后取其中的最小值。您一直在拆分,直到只有一个元素终止了递归。
@chux already wrote the code,我不需要重复。
为什么他们要您从某个索引开始这样做并没有多大意义。我怀疑您真正应该做的是使用中点将数组分成两半并像这样递归...
int findMin(int arr[], int start, int len) {
assert(len > 0);
if(len == 1 ) {
return arr[start];
}
int mid = len/2;
int left_min = findMin(arr, start, mid);
int right_min = findMin(arr, mid, len - mid);
return left_min < right_min ? left_min : right_min;
}
int main(void) {
int array[7]= {23,17,8,7,9,32,56};
printf("%d\n", findMin(array, 0, 7));
}
这避免了必须执行指针算术。指针算术通常更快,更简单,但通常要等到以后再学习。