2017-01-20 59 views
0

我非常新的C所以这个问题可能是愚蠢的,但我真的不明白为什么一个递归功能给了我分段错误,而另一个人(只有一个参数改变),没有给我什么。 因此,这些函数用于计算“vette”(我的源代码中的变量的名称)的数量,该数字大于数组中所有其他连续数字(不包括最后一个数字)的数字。Ç - 分段故障递归

这是非工作之一:

#include <stdio.h> 
#include <stdlib.h> 
#define N 6 
int vette(int *a, int len, int lentot) { 
    /* end of the array */ 
    if (lentot<=1) return 0; 
    /* checked if the element is a vetta*/ 
    if (len == 1) { 
    return 1 + vette(&a[1], lentot-1, lentot-1); 
    } 
    /* checking */ 
    if (*a>a[len-1]) 
    return vette(a, lentot-1, lentot); /* this line gives me seg fault */ 
    else 
    return vette(&a[1], lentot-1, lentot-1); 
} 
/*trying the function*/ 
int main() { 
    int a[6]={10,9,4,5,7,6}; 
    printf("%d", vette(a,N,N)); 
} 

正如你所看到的,我使用LEN和lentot作为指标的影响来导航到函数。但是,由于某些原因,我不明白,函数给我一个错误,我写了“/ *这条线给我seg错误* /。

同时,更改lentot-1的变量len-1,在那一刻有相同的值,不会改变lentot的值,因为它在参数int len,所以什么也不应该发生,但是我的代码开始工作完美。 这里代码:

#include <stdio.h> 
#include <stdlib.h> 
#define N 6 
int vette(int *a, int len, int lentot) { 
    /* end of the array */ 
    if (lentot<=1) return 0; 
    /* checked if the element is a vetta*/ 
    if (len == 1) { 
    return 1 + vette(&a[1], lentot-1, lentot-1); 
    } 
    /* checking */ 
    if (*a>a[len-1]) 
    return vette(a, len-1, lentot); 
    else 
    return vette(&a[1], lentot-1, lentot-1); 
} 
/*trying the function*/ 
int main() { 
    int a[6]={10,9,4,5,7,6}; 
    printf("%d", vette(a,N,N)); 
} 

我会很感激,以理解为什么这个代码是给我这个错误,非常感谢事先!

+0

输入函数时打印变量的值。这应该马上告诉你发生了什么事。 – dbush

+0

@dbush非常感谢这个建议:结果是工作中的正确值,但是在非工作状态中有一个递归函数的循环。 lentot总是5,而len总是6.我没有理由为什么,即使在工作中,len是6,lentot在递归函数的一个步骤中是5! –

+0

对不起,我是在问题开始时写的,但如果有什么不清楚的地方,告诉我! “因此,这些函数用来计算”vette“(我的源代码中的变量名)的数量,这个数字大于数组中所有其他连续数字的数字(不包括最后一个)。”所以,例如,{4,6,1,2}有1个“vette”,即6,因为比每个连续的数字都要大。我只需要“vette”的数量! –

回答

0

由于堆栈溢出(无双关语),这会给您一个分段错误。你的递归永远不会结束。第二个参数lentot-1不会减少。当您将其更改为len-1时,它确实如此。

从您的主程序开始,在第一次递归调用len = lentot = 6。然后,在被控线路的第二次递归调用中,len = 5lentot = 6。问题在于,第三个问题仍然是len = 5lentot = 6,依此类推。

+0

我很抱歉,但我不明白为什么。在Len的“地点”赋予函数* lentot -1 *不等于给len?所以,不会* lentot - 1 *成为函数中的新len?编辑:了解;我每次都传递相同的变量。非常感谢! –

+0

我补充说明一些。如果遇到像这样的问题,你应该使用一个调试器或一个'printf'来跟踪变量的值。 – nickie