我正在写一个程序,它将取一个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。