簡體   English   中英

需要幫助理解這個遞歸函數

[英]Need help understanding this recursive function

我正在學習遞歸,我們應該從數組中獲得最大的數字,但我不明白解決方案。

#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)為false 后,我不明白返回相同的函數。

對於初學者來說,遞歸函數定義很糟糕,通常會導致未定義的行為。

第一個參數應該用限定符 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 } 組成的子數組。 這個值是子數組的最大值,因為太陽數組只包含一個元素。 因此,為 0 的元素的索引返回到函數的前一次調用。

現在,該函數將返回的最大值為 3 的值與索引 ( n - 1 ) 處的元素(即索引 1 處等於 4 的元素)進行比較。因此,該函數將索引 1 返回到函數的第一次調用。

這里再次比較最大值為 4 與索引 ( n - 1 ) 處的元素值在此調用中等於 2。由於值 1 小於值 4,因此索引為 1,返回最大值的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM