gpt4 book ai didi

C - 递归段错误

转载 作者:行者123 更新时间:2023-11-30 16:51:28 25 4
gpt4 key购买 nike

我对 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错误*/。

同时,用len-1改变lentot-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));
}

我真的很感激理解为什么这段代码会给我这个错误,提前非常感谢!

最佳答案

由于堆栈溢出(没有双关语),这会给您带来段错误。你的递归永远不会结束。第二个参数 lentot-1 不会减少。当您将其更改为 len-1 时,它就会生效。

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

关于C - 递归段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41772417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com