gpt4 book ai didi

c - 递归导致的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:31:14 25 4
gpt4 key购买 nike

我正在编写一个程序,用于取 1-10 之间的数字并显示排列数字的所有可能方式。

前输入:3输出:

   1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

每当我输入 9 或 10 时,程序都会给出一个段错误并转储核心。我认为问题是我的递归算法被调用了太多次。有人可以帮助指出我如何限制必要的递归调用量吗?这是我当前的代码:

void rearange(int numbers[11], int index, int num, int fact) {

int temp = numbers[index];
numbers[index] = numbers[index-1];
numbers[index-1] = temp;

int i;
for (i = 1; i <= num; ++i) // print the current sequence
{
printf("%d ", numbers[i]);
}
printf("\n");

fact--; // decrement how many sequences remain
index--; // decrement our index in the array

if (index == 1) // if we're at the beginning of the array
index = num; // reset index to end of the array

if (fact > 0) // If we have more sequences remaining
rearange(numbers, index, num, fact); // Do it all again! :D
}

int main() {
int num, i; // our number and a counter

printf("Enter a number less than 10: ");
scanf("%d", &num); // get the number from the user

int numbers[11]; // create an array of appropriate size
// fill array
for (i = 1; i <= num; i++) { // fill the array from 1 to num
numbers[i] = i;
}

int fact = 1; // calculate the factorial to determine
for (i = 1; i <= num; ++i) // how many possible sequences
{
fact = fact * i;
}

rearange(numbers, num, num, fact); // begin rearranging by recursion

return 0;
}

最佳答案

9! (362880) 和 10! (3628800) 是溢出 call stack 的巨大数字 当你进行尽可能多的递归调用时。因为所有的局部变量和形式参数都必须存储。您要么必须增加堆栈大小,要么将递归转换为迭代。

在 linux 上,你可以这样做:

ulimit -s unlimited

将堆栈大小设置为无限制。默认值通常为 8MB。

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

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