从某个点寻找数组的最小值

时间:2019-01-26 00:56:32

标签: c

我正在尝试创建一个递归函数,该函数将在输入到函数中的特定点之后返回数组的最小值。

这需要递归地完成而不使用循环。

这是我到目前为止所拥有的:

a.or(b).flip()

我不确定自己在做什么错,我可以寻求帮助。

2 个答案:

答案 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));
}

这避免了必须执行指针算术。指针算术通常更快,更简单,但通常要等到以后再学习。