2011-08-28 51 views
0

我正在嘗試使用遞歸函數在數組中找到最小值數,但是我的代碼給出了segemtation錯誤。爲什麼下面的代碼給出了分段故障問題?

main() 
{ 
    int a[5]={2,1,4,5,3}; 
    int n=1; 
    fumi(a,n,a[0],5); 
} 

fumi(int a[],int n,int min,int t) 
{ 
    if(n==t) 
    { 
     printf("%d",min); 
    } 
    if(a[n]<min) 
    { 
     min=a[n]; 
    } 
    return(fumi(a,n+1,min,t)); 
} 

在哪裏做錯了,也主要是沒有返回任何東西是不是故障的原因。

+0

注:作爲一個練習遞歸,這可能是有趣的,但在實際的程序,這是不好的_extremely_理念。 –

+0

這將是一個壞主意? –

+0

當你想排序'a [10000]'(不知道數字),你會讓你的程序崩潰(通過http://en.wikipedia.org/wiki/Stack_overflow),除非編譯器刪除遞歸作爲優化。雖然非遞歸函數佔用5行,但佔用內存少,易於理解,(也)更快。 –

回答

4

您還應該在printf("%d",min);之後return否則,您檢查if (a[t] < min),a[t]未分配。

fumi(int a[],int n,int min,int t) 
{ 
    if(n==t) 
    { 
     printf("%d",min); 
     return; //This line was added 
    } 
    if(a[n]<min) 
    { 
     min=a[n]; 
    } 
    return(fumi(a,n+1,min,t)); 
} 
+0

感謝@amit它的作品,但我的代碼是錯誤的? –

+0

@Amit Singh Tomar:你沒有停止遞歸,當試圖訪問沒有被你分配的[5]時,你有一個seg-fault。返回後,打印停止遞歸併阻止訪問未分配的內存。 – amit

+0

是的,得到了​​你的意見@Amit! –

2

您的代碼非常接近工作。它崩潰的原因是因爲遞歸永遠不會停止,並且一直走到數組的末尾。

您正確檢查n == t並打印出結果,但在此之後您不返回。代碼一直運行到無窮遠。只需添加printf後返回解決了這個問題:

void fumi(int a[],int n,int min,int t) 
{ 
    if(n==t) 
    { 
     printf("%d",min); 
     return; // stop recursing 
    } 
    if(a[n]<min) 
    { 
     min=a[n]; 
    } 
    fumi(a,n+1,min,t); 
} 
2

執行後

if(n==t) 
{ 
    printf("%d",min); 
} 

它不返回,而是繼續做:

if(a[n]<min) 
{ 
    min=a[n]; 
} 

所以當基本條件滿足它不會返回。因此fumi函數總是被遞歸地調用。段錯誤的

兩個原因:

  1. 作爲n超出最大數組長度,未分配的(非法)的內存訪問觸發它
  2. 由於遞歸不回,我們得到了一個棧溢出,導致到分段故障。

以先發生者爲準。

因此您的代碼需要修正是當它遇到的基本條件返回:

if(n==t) 
{ 
    printf("%d",min); 
    return; 
} 
+1

感謝@phoxis爲你的好解釋 –