2011-08-28 112 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为你的好解释 –