2013-08-24 59 views
-1
`/* finding the minimum number of a array */ 
#include<stdio.h> 

int minimum(int n, int a[n], int x); 

int main(void) 
{ 

    int a[5] = { 5, 4, 3, 4, 5 }; 
    printf("%d \n", minimum(4, a, 0)); 
    return 0; 
} 

int minimum(int n, int a[n], int x) 
{ 
    int minima; 
    if (x >= n) 
    return a[x]; 
    else 
    minima = minimum(n, a, x + 1); 
    if (a[x] > minima) 
    return minima; 
} 
` 

嘿我讀了stackoverflaw幾個遞歸源。還發現使用JAVA的同類問題。你可以請我解釋一下這段代碼是如何工作的。或者這是一個很好的代碼。我使自己學習遞歸,它正在工作。請解釋一下。遞歸如何找到一個數組的最小值

+0

有沒有你不明白的代碼的特定部分? –

+6

「stackoverflaw」很好。 – alk

+0

@alk「stackoverflaw」:D – P0W

回答

1

有在你的代碼的兩個問題:

  • 終止發生爲時已晚:您返回a[x]x==n - 這是過去的結束一個元素。
  • a[x] > minima爲假時,會有一個缺失的回報:您的功能沒有返回a[x]而結束。

要解決這兩個問題,改變的終止條件的檢查,並添加缺少的回報:

if(x >= n-1) return a[n-1]; 
// You do not need an else after a return 
minima = minimum(n,a,x+1); 
if (a[x] > minima) return minima; 
return a[x]; 

注意,您可以通過從數組結束搜索保存一個參數直到你達到指數零爲止。

+0

所以最後一行返回一個[x],如果條件失敗right.Do你認爲這段代碼是正確的。沒有一個可能的數據集會給這個方法的錯誤答案? –

+1

@KrvPerera不,沒有這樣的數據集。你應該能夠正式證明它(試一試,這很有趣!你所需要的只是對[數學歸納](http://en.wikipedia.org/wiki/Mathematical_induction)的基本理解)。 – dasblinkenlight

+0

好的,我得到它。是否有一些更好的遞歸代碼來做同樣的事情。可以用尾遞歸函數替換它。 –