Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C程序中用递归求极小值和极大值_C_Function_Recursion - Fatal编程技术网

在C程序中用递归求极小值和极大值

在C程序中用递归求极小值和极大值,c,function,recursion,C,Function,Recursion,我需要你的帮助 我需要做一个递归函数,找到它接收的任何数组的最小值和最大值 我需要实现函数void minMax(int arr[],int left,int right,int min_max[]),但我不知道如何开始,我希望您能给我一些想法 这是输出应如何显示的e.x: min_max[1]=100וmin_max[0]=(-4) 关于这一细节: left=2,right=5,arr=[3,−1,3,100,2,−4,3],假设:左首先,这个问题有一个可怕的修订。为了得到更好的答案,你应该在

我需要你的帮助

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

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

这是输出应如何显示的e.x:
min_max[1]=100וmin_max[0]=(-4)

关于这一细节:
left=2,right=5,arr=[3,−1,3,100,2,−4,3]
,假设:左首先,这个问题有一个可怕的修订。为了得到更好的答案,你应该在你的问题上多下功夫,否则会让其他人更难帮助你,也会觉得你之前做的研究不够

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

参数不需要,或者我不了解它们的用途

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

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)

函数最小值(arr,mixMax)
如果arr为空
返回
elem=从arr中提取最后一个elem
如果mixMax[0]为空或elem>mixMax[0]
mixMax[0]=元素
如果mixMax[1]为空或elem
我认为您正在寻找的是锦标赛方法:

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

(这类似于二进制搜索)

#包括
结构对
{
int-min;
int max;
}; 
结构对getMinMax(int-arr[],int-low,int-high)
{
结构对最小最大值,mml,mmr;
int mid;
//如果只有一个元素
如果(低==高)
{
minmax.max=arr[低];
minmax.min=arr[低];
返回最小最大值;
} 
/*如果有两个元素*/
如果(高==低+1)
{  
如果(arr[低]>arr[高])
{
minmax.max=arr[低];
minmax.min=arr[高];
} 
其他的
{
minmax.max=arr[高];
minmax.min=arr[低];
} 
返回最小最大值;
}
/*如果有两个以上的元素*/
中等=(低+高)/2;
mml=getMinMax(arr、低、中);
mmr=getMinMax(平均、中+1、高);
/*比较两部分的最小值*/
如果(mml.minmmr.max)
最小最大值=毫米最大值;
其他的
minmax.max=mmr.max;
返回最小最大值;
}
/*用于测试上述功能的驱动程序*/
int main()
{
int arr[]={1000,11,445,1,330,3000};
int arr_size=6;
结构对minmax=getMinMax(arr,0,arr\u size-1);
printf(“n最小元素为%d”,最小最大最小值);
printf(“n最大元素为%d”,minmax.max);
getchar();
}

来源:(方法2)

注意,您可以使用那些
left
right
参数来指定越来越小的子集。这是一个关于
c
的问题,你说“如果mixMax[0]是空的”是什么意思?你能解释一下在这个伪代码中递归是如何实现的吗?不幸的是,我不知道c说minMax数组可以用[Null,Null]值初始化,这些值在第一个递归中被替换,这就是我说的“empty”的意思. 递归之所以有效,是因为从数组中提取一个元素进行递归,这样数组大小每次都会减小,直到满足基本条件时为空。(arr为空)。请注意,minMax(arr,minMax)函数调用在函数范围内。可以,但请注意,
int
类型没有空状态,
int
变量始终有一个值。它可能是0,INT_MAX(最大整数值),42,或者如果未初始化,它可能是不确定的(内存中的任何内容)。此外,要实现“数组大小每次都减小”的概念,您还应该传递扩展数据块(
int arr[]
只是指向第一个元素的指针,大小的概念丢失,但是使用
left
right
函数可能知道子数组的第一个和最后一个索引)@Bob_uuu我必须使用函数签名中的所有参数,左参数和右参数是数组的索引。@Bob_uuu理解,正如我所说,我不知道C,所以我无法预见它的技术限制。在JS或Python中,您可以无缝地用空值填充数组,还可以随时间增加或减少数组的大小。为了避免空值问题,您可以使用INT_MAX和INT_MIN初始化minMax数组。此外,您还可以去掉
right
参数,只使用
left
一个来移动索引,但这与同时使用参数和切片数组是一样的,此外,使用数组切片可能还有性能方面的原因,如果允许对数组进行排序,这很容易(存在递归排序算法),请在询问kingminor:Given之前付出一些努力假设:左边谢谢你的回答,我想你关于二进制搜索的相似性是对的,但是解决方案应该是简单的递归。此外,我需要在上面提到的所有参数中使用函数签名。@user14674651与签名的区别只是命名不同(
left
->
low
,等等)以及返回的
pair struct
,而不是作为指针传递的
max\u max
。正确地重构它应该很容易…@Bob_uuuuu,但解决方案需要简单到这一步(可能需要7行代码),我不知道如何进行重构。你有主意吗?
#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();
}