使用递归在数组中查找max

时间:2015-03-20 12:54:09

标签: c recursion

我想通过递归找到数组中的最大数, 这段代码有什么问题。

 #include<stdio.h>
int find_max(int *a,int n){
    int m_max;
    if(n==1){
        return a[0];
    }
    m_max=find_max(a,n-1);
    if(a[n-1]>m_max)
        m_max=a[n-1];
}

4 个答案:

答案 0 :(得分:3)

  1. 正如@moffeltje所说,&#34;当n!= 1&#34;

    时,没有回复
      if(a[n-1]>m_max) 
        m_max=a[n-1];
      return m_max;  // add
    }
    
  2. 这种线性方法为递归提供了一个错误的名称。如果有n个数字,则最大递归深度为n。最好将2分为最大深度log2(n)

    int find_max(const int *a, int n) {
      if (n <= 1) {
        return a[0];
      }
      int left = find_max(a, n/2);
      int right = find_max(&a[n/2], n - n/2);
      return left > right ? left : right;
    }
    
  3. ---次要内容

    1. 应对n < 1a == NULL

      的角落案例
      int find_max(const int *a, int n) {
        if (n <= 1 || a == NULL) {
          if (n <= 0 || a == NULL) return INT_MIN;  // or throw error
          return a[0];
        }
        ...
      
    2. 更改int find_max(int *a, int n) - &gt; int find_max(const int *a, int n)允许传递常量数组。

    3. 数组大小最好输入size_t而不是int

      int find_max(const int *a, size_t n) {
        ...
      }
      

答案 1 :(得分:1)

#include<stdio.h>
int find_max(int *a,int n){
    int m_max;
    if(n==1){
        return a[0];
    }
    m_max=find_max(a,n-1);
    if(a[n-1]>m_max)
        m_max=a[n-1];
    return m_max;
}

当n!= 1时你没有返回任何东西。 看看设计这些东西时,你应该经常检查 -

  

基本情况。在这种情况下,当n = 1时就会实现。(剩下一个元素,它是最大的元素)

     

递归案例。在这里,您将使用计算值来处理较小的案例,现在您将构建解决方案,认为已经计算过以前的案例。

     

合并合并计算结果。您提供的最后一个if条件。但是你忘了把一个没有结果的回报给别人。这就是出现这个问题的地方。

答案 2 :(得分:0)

或者,您可以简化功能。

int max_array_val( int* a_Array, int a_Size )
{
    int max = a_Array[ 0 ];

    for( int i = 1;  i < a_Size;  i++ )
        if( a_Array[ i ] > max )
            max  = a_Array[ i ];

    return max;
}

int main()
{
    int int_array[ 6 ] = { 3, 2, 6, 5, 5, 2 };

    printf( "Maximum number is: %i\n\n", max_array_val( int_array, sizeof( int_array ) / sizeof( int ) ) );
    system( "pause" );

    return 0;
}

答案 3 :(得分:0)

int getMax(int const * arr, int size) {
    if (size == 1)
        return *arr;

    int ans = getMax(arr + 1, size - 1);
    return *arr > ans ? *arr : ans;
}