【问题标题】:Finding minimun and maximum using recursion in C program在 C 程序中使用递归查找最小值和最大值
【发布时间】:2021-03-23 01:02:08
【问题描述】:

我需要你的帮助。

我需要做一个递归函数来找到它接收到的任何数组的最小值和最大值。

我需要实现函数void minMax(int arr[], int left, int right, int min_max[]),但我不知道如何开始,希望您能给我一些想法。

这是输出应该如何显示的一个例子: min_max[1]=100 ו min_max[0]=(-4)

关于这个细节: left = 2 , right = 5, arr = [3,−1,3,100,2,−4,3],假设:左

谢谢大家。

【问题讨论】:

  • 如果允许对数组进行排序,这很容易(存在递归排序算法)
  • 问之前要努力

标签: c function recursion


【解决方案1】:

我认为您正在寻找的是锦标赛方法:

将数组分成两部分,比较两部分的最大值和最小值,得到整个数组的最大值和最小值

(类似于二分查找)

#include<stdio.h>

struct pair 
{
int min;
int max;
}; 

struct pair getMinMax(int arr[], int low, int high)
  {
    struct pair minmax, mml, mmr;    
    int mid;

    // If there is only one element 
    if (low == high)
      {
          minmax.max = arr[low];
          minmax.min = arr[low];     
          return minmax;
      } 

     /* If there are two elements */
    if (high == low + 1)
      {  
         if (arr[low] > arr[high]) 
      {
            minmax.max = arr[low];
            minmax.min = arr[high];
      } 
    else
      {
            minmax.max = arr[high];
            minmax.min = arr[low];
      } 
    return minmax;
   }

   /* If there are more than 2 elements */
   mid = (low + high)/2; 
   mml = getMinMax(arr, low, mid);
   mmr = getMinMax(arr, mid+1, high); 

  /* compare minimums of two parts*/
   if (mml.min < mmr.min)
        minmax.min = mml.min;
   else
        minmax.min = mmr.min;    

  /* compare maximums of two parts*/
  if (mml.max > mmr.max)
       minmax.max = mml.max;
  else
       minmax.max = mmr.max;     

  return minmax;
 }

/* Driver program to test above function */
int main()
{
int arr[] = {1000, 11, 445, 1, 330, 3000};
int arr_size = 6;
struct pair minmax = getMinMax(arr, 0, arr_size-1);
printf("nMinimum element is %d", minmax.min);
printf("nMaximum element is %d", minmax.max);
getchar();
}

来源:https://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/(方法二)

【讨论】:

  • 次要:给定“假设:左 mid = (low + high)/2; 可能会溢出,而mid = low + (high - low)/2; 不会。
  • 谢谢你的回答,我猜你对二分搜索的相似性是正确的,但递归的解决方案应该很简单。另外,我需要在上面提到的所有参数中使用函数签名。
  • @user14674651 与您签名的区别只是命名不同(left -> low 等)并且返回的 pair struct 而不是 max_max 作为指针传递。正确重构它应该很容易......
  • @Bob__ 但解决方案需要很简单(可能是 7 行代码),我不知道怎么做。你有什么想法吗?
【解决方案2】:

首先,这个问题的编辑很糟糕。为了获得更好的答案,您应该更多地解决您的问题,否则会让其他人更难帮助您,并且感觉您之前没有做足够的研究。

关于你的问题的内容,我会先用伪代码解决这个问题(与任何其他“硬”问题一样)。我想这是作业,因为你已经有了函数签名。

left 和 right 参数不是必需的,或者我不明白它们的用途。

伪代码函数可能如下所示:

function minMax(arr, mixMax)
  if arr is empty
    return
  
  elem = extract last elem from arr

  if mixMax[0] is empty or elem > mixMax[0]
    mixMax[0] = elem

  if mixMax[1] is empty or elem < mixMax[1] 
    mixMax[1] = elem

  minMax(arr, minMax)

【讨论】:

  • 请注意,您可以使用left 和right 参数来指定越来越小的子集。提出关于c 的问题,“如果 mixMax[0] 为空”是什么意思,您能否解释一下这个伪代码中的递归是如何实现的?
  • 不幸的是我不知道 C 说 minMax 数组可以用在第一次递归中替换的 [Null, Null] 值进行初始化,这就是我所说的“空”。递归有效,因为您从数组中提取一个元素进行递归,这样数组大小每次都会减小,直到满足基本条件为止。 (arr 为空)。注意 minMax(arr, minMax) 函数调用在函数范围内。
  • 好的,但是请注意int 类型没有 Null 状态,int 变量 always 有一个值。它可能是 0、INT_MAX(最大整数值)、42,或者如果它未初始化,它可能是不确定的(无论内存中有什么)。此外,要实现“数组大小每次减小”的概念,您也应该传递范围(int arr[] 只是指向第一个元素的指针,大小的概念丢失了,但使用 left 和 @987654329 @函数可能知道子数组的第一个和最后一个索引)。
  • @Bob__ 我必须使用函数签名中的所有参数,左右参数是数组的索引。
  • @Bob__ 明白,正如我所说我不懂 C,所以我无法预见它的技术限制。在 JS 或 Python 中,您可以使用 Null 值无缝填充数组,并随着时间的推移增加或减少它的大小。为避免 Null 问题,您可以使用 INT_MAX 和 INT_MIN 初始化 minMax 数组。你也可以去掉 right 参数,只使用 left 一个来移动索引,但这有点像同时使用参数和切片数组,也可能有使用数组切片的性能原因,
猜你喜欢
  • 2016-05-07
  • 2021-12-08
  • 2021-12-08
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 2017-08-18
  • 1970-01-01
相关资源
最近更新 更多