【问题标题】:How can you find the minimum value in an array using recursion? [closed]如何使用递归找到数组中的最小值? [关闭]
【发布时间】:2014-08-21 05:39:55
【问题描述】:

我必须编写一个 C 代码,使用递归查找数组中的最小值。我已经使用 for 循环完成了,但递归更棘手。有人可以帮帮我吗?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 你尝试过什么了吗?像往常一样使用递归:解决退化的情况(单元素数组),然后处理一般情况。
  • 对于大型数组,您可以(从概念上)将它们分成两半并考虑每一半。这是递归!
  • 用户在这里提出了第一个问题,并获得反对票! @angie 请在 SO 上发布您尝试过并欢迎的内容
  • @angie 我建议你看不到答案。请通过一个简单的示例找到您的解决方案,例如具有 1 个元素的数组,然后是 2 个元素,然后是 3 个元素,依此类推。三个步骤后,您可能会找到答案。

标签: c


【解决方案1】:
  • 单个项目数组的最小值是该单个项目(基本情况或终止条件)。

  • 数组的最小值是[第一项,其余项中的最小值(不包括第一项)]的最小值

【讨论】:

    【解决方案2】:

    这是使用递归查找最小值的简单代码,

    int rec(int a[],int n)
    {
        int min;
    
        if(n==1)
            return a[0];
    
        else {
            min=rec(a,n-1);
    
            if(min<a[n-1])
                return min;
            else
                return a[n-1];
        }
    
    } 
    
    void main()
    {
        int i,j,n,a[20];
        printf("enter n :");
        scanf("%d",&n);
        printf("enter values : ");
    
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);  
        }
    
        printf("\n%d",rec(a,n));
    
        getch();
    }
    

    【讨论】:

    • 恭喜 - 与 OP 在编写问题和寻找解决方案时相比,您在提供阅读后的复制粘贴直接到家庭作业的答案方面付出了更多努力。
    • 不是这样的,我需要理解这个答案,而不仅仅是复制粘贴
    • void main 很痛苦。
    • 我不明白这个:min=rec(a,n-1);我知道 a[] 是数组,但我还是不明白。
    • 为此,您需要了解通过程序堆栈执行递归函数..此链接可能会有所帮助mooreccac.com/kcppdoc/Recursion.htm
    【解决方案3】:
    #include <stdio.h>
    
    int minimum(int *a_s, int *a_e, int candidate){
        if(a_s == a_e)
            return candidate;
        return  minimum(a_s+1, a_e, *a_s < candidate ? *a_s : candidate);
    }
    
    int main(void){
        int array[] = { 1,3,-2,0,-1};
    
        printf("%d ", minimum(array+1, &array[sizeof(array)/sizeof(*array)], *array));
    
        return 0;
    }
    

    【讨论】:

    • 做OP的功课可能不是个好主意。另外,你的代码对初学者来说可能很神秘。
    • @Quentin 我们不知道这是作业,也不是初学者(眨眼,眨眼,;-))。尽管如此,提供一个需要 OP 才能理解的答案对我来说似乎是一个好主意,以回应这样的帖子。
    【解决方案4】:

    接受回答后。

    下面是一个不会破坏堆栈的递归解决方案。估计 O(ln2(n)) 处的最大堆栈深度。其他解决方案看起来最大堆栈深度为 O(n)。

    int ArrayMin(const int a[], size_t n) {
      if (n <= 1) {
        if (n < 0) return 0;  // Handle degenerate ArrayMin( ,0)
        return a[0];
      }
      size_t nhalf = n / 2;
      int left = ArrayMin(a, nhalf);
      int right = ArrayMin(&a[nhalf], n - nhalf);
      return left < right ? left : right;
    }
    

    9 小时后得到答复,我们可以假设作业截止日期已过。

    【讨论】:

      【解决方案5】:
      1. 考虑数组的第一个元素是最小的。
      2. 通过传递数组的基地址和元素数量来调用函数。
      3. 检查任何其他数字是否小于最小值,如果是,则将该值分配给最小值。
      4. 对于每次迭代,增加数组地址并减少元素数量!

      试试这个代码-

      #include<stdio.h>
      int min;
      int arrfun(int *arr,int n)
      {
              if(n){
                      if(*arr < min) // check any no is less than minimum.
                              min = *arr; // if yes assign it
              }
              else
                      return min; // when n becomes 0 it returns the minimum element
              arrfun(++arr,--n); // recursive call
      }
      
      int main()
      {
              int arr[]={7,3,9,2,1,6};
              min = arr[0]; // Taking first element is minimum
              printf("minimum is: %d\n",arrfun(arr,6)); // call the function by passing address and no of elements in array
              return 0;
      }
      

      【讨论】:

      • 您在arrfun 的末尾忘记了return。此外,我从未见过使用全局变量的递归。
      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 2010-12-16
      • 2022-12-10
      • 2016-03-27
      相关资源
      最近更新 更多