需要帮助了解此递归函数

时间:2020-03-23 17:15:01

标签: c recursion max function-definition

我正在学习递归,我们应该从数组中获取最大数目,但是我不了解解决方案。

#include<stdio.h>
#include<stdlib.h>
int biggestNumber(int *array, int n);

int main(void){
  int n=3;
  int array[3]={3,4,1};
  fprintf(stdout, "|||||%d\n", biggestNumber(array,n));
  return 0;
}

int biggestNumber(int *array, int n){
  if(n==1){
    return array[0];
  }
  else{
    if(array[n-1]>biggestNumber(array, n-1)){
      return array[n-1];
    }
    else{
      return biggestNumber(array, n-1);  
    }
  }
}

我似乎无法理解此递归函数。在array[n-1]>biggestNumber(array, n-1)为假之后,我不知道返回相同的功能。

1 个答案:

答案 0 :(得分:0)

对于初学者而言,递归函数定义很差,通常会导致未定义的行为。

第一个参数应使用限定符const声明,因为函数中的数组未更改。

第二个参数应具有类型size_t

在函数内,例如,如果第一个if语句产生false,则可以两次调用递归调用。

if(array[n-1]>biggestNumber(array, n-1)){
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  return array[n-1];
}
else{
  return biggestNumber(array, n-1);  
         ^^^^^^^^^^^^^^^^^^^^^^^^^
}

可以按照下面的演示程序所示对函数进行声明和定义

#include <stdio.h>

size_t biggestNumber( const int a[], size_t n )
{

    if ( n < 2 )
    {
        return 0;
    }
    else
    {
        size_t max_i = biggestNumber( a, n - 1 );
        return a[max_i] < a[n-1] ? n - 1 : max_i;
    }
}

int main(void) 
{
    int a[] = { 3, 4, 1 };
    const size_t N = sizeof( a ) / sizeof( *a );

    size_t i = biggestNumber( a, N );

    printf( "The biggest number is %d\n", a[i] );

    return 0;
}

程序输出为

The biggest number is 4

原理很简单。由于该函数是递归的,因此对于任何给定的n个(数组中元素的数目),该函数将查找数组中前n个-1个元素中最大元素的索引。然后将子数组中找到的最大值与索引为n-1的元素进行比较。

例如,对于第一个递归调用,该函数搜索子数组{ 3, 4 }中最大元素的索引。

对于此子数组,该函数调用由一个元素{3}组成的子数组。该值是子数组的最大值,因为sun数组仅包含一个元素。因此,元素的索引为0将返回到该函数的上一个调用。

现在,函数将返回的最大值3的值与索引(n-1)处的元素(即索引1等于4)进行比较。因此,该函数将索引1返回到索引的第一个调用功能。

这里再次将最大值4与索引(n-1)中元素的值进行比较,该元素在此调用中等于2。值1小于值4时, index 1,返回最大值的索引。