[英]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.