【问题标题】:Can someone explain this code that recursively finds the minimum element in an array in C?有人可以解释这个递归地在 C 中找到数组中的最小元素的代码吗?
【发布时间】:2016-06-14 02:50:09
【问题描述】:

我不太明白这段代码。因此,例如 n = 5 我们有:

array[5] = {13, 27, 78, 42, 69}

有人能解释一下吗?

我的理解是如果n = 1,那是最低的。 但是当n = 5时,我们会得到第4个索引并将其与第4个索引进行比较并检查哪个是最小的并返回最小的,然后将第4个索引与第3个索引进行比较并检查哪个是最小的并且返回最小的?我很困惑。

int min(int a, int b)
{
  return (a < b) ? a: b;
}

// Recursively find the minimum element in an array, n is the length of the
// array, which you assume is at least 1.
int find_min(int *array, int n)
{ 
   if(n == 1)
       return array[0];
    return min(array[n - 1], find_min(array, n - 1));
}

【问题讨论】:

标签: recursion


【解决方案1】:

给定你的数组:

1. initial call: find_min(array, 5)
      n!=1, therefore if() doesn't trigger
2.    return(min(array[4], find_min(array, 4)))
          n!=1, therefore if doesn't trigger
3.        return(min(array[3], find_min(array,3)))
             n!=1, therefore if doesn't trigger
4.           return(min(array[2], find_min(array,2)))
                  n!=1, threfore if() doesn't trigger
5.                return(min(array[1], find_min(array,1)))
                        n==1, so return array[0]
4.                return(min(array[1], array[0]))
                  return(min(13, 27)
                  return(13)
 3.          return(min(array[2], 13))
     etc...

【讨论】:

  • 为什么会有find_min(n, 4),不应该是find_min(array, 4)吗?只是想知道。
  • 是的,错字。第一个 arg 并不重要,因为无论如何它在调用堆栈中都是恒定的。重要的是 n arg。
  • 那么第 4 个索引,与索引 4,3,2,1,0 进行比较并选择最小值?然后第三个索引,与索引 3,2,1,0 进行比较并选择最小值?等等?
  • 没有。仍然只有 5 个比较,因为只有 5 个数组元素。调用向下递归,直到到达数组的末尾,然后在返回的路上开始比较这些值。
  • 好的,所以一旦开始比较这些元素,它会查找数组 [0],它只有 1 个元素,然后查找数组 [1],它有 2 个元素并找到它们的最小值?然后它查看数组 [2],它有 3 个元素并找到它们的最小值?抱歉,我只是想真正理解这一点。
【解决方案2】:

这很简单。使用您提供的示例运行代码。

在第一次运行 find_min() 时,它将返回数组中最后一个元素的最小值 (69) 和数组其余部分的最小值。为了计算数组其余部分的最小值,它调用自身,即它是递归的。这个第二级调用会将数字 42(新的“最后一个”元素)与数组其余部分的最小值进行比较,依此类推。对 find_min() 的最终调用将具有数组“{13}”的 n=1,因此它将返回 13。调用它的层会将 13 与 27 进行比较,并发现 13 较小,因此它将返回它,并且等等备份链。

注意:我假设您的代码中不应该存在反向引号。

【讨论】:

  • 那么 69 会与 42、13、27 和 13 进行比较吗?那么它 42 会与 13、27 和 13 进行比较吗?
  • 后向引号,在哪里?
【解决方案3】:

该解决方案使用递归来计算可能的最小比较集的最小值,并将该结果与下一个更大的数字集进行比较。每个递归调用都返回一个结果,该结果以向后的方式与下一个元素进行比较,直到最小值冒泡到顶部。递归一开始似乎很棘手,但一旦你熟悉它就会非常有效。

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 2018-03-19
    相关资源
    最近更新 更多