c语言全排列递归问题
#include<stdio.h>intA[100];//输出1~n的全排列的递归函数voidprint_permutation(intn,int*A,intcur){i...
#include<stdio.h>
int A[100];
// 输出1~n的全排列的递归函数
void print_permutation(int n, int* A, int cur) {
int i, j;
if(cur == n) { // 递归边界
for(i = 0; i < n; i++) printf("%d ", A[i]);
printf("\n");
}
else for(i = 1; i <= n; i++) { // 尝试在A[cur]中填各种整数i
int ok = 1;
for(j = 0; j < cur; j++)
if(A[j] == i) ok = 0; // 如果i已经在A[0]~A[cur-1]出现过,则不能再选
if(ok) {
A[cur] = i;
print_permutation(n, A, cur+1); // 递归调用
}
}
}
int main() {
print_permutation(4, A, 0);
return 0;
}
这道题递归是怎么实现的?我尝试自己手算了好多遍,都是只能输出1,2,3,4啊。。。我理解的是每递归一次cur就+1,到等于4时就结束了,然后每次递归得出一个数,到最后不就是1,2,3,4吗?那些2,3,4开头的排列是怎么递归出的啊?求解!最好能说下每次递归得出什么,感激不尽!!! 展开
int A[100];
// 输出1~n的全排列的递归函数
void print_permutation(int n, int* A, int cur) {
int i, j;
if(cur == n) { // 递归边界
for(i = 0; i < n; i++) printf("%d ", A[i]);
printf("\n");
}
else for(i = 1; i <= n; i++) { // 尝试在A[cur]中填各种整数i
int ok = 1;
for(j = 0; j < cur; j++)
if(A[j] == i) ok = 0; // 如果i已经在A[0]~A[cur-1]出现过,则不能再选
if(ok) {
A[cur] = i;
print_permutation(n, A, cur+1); // 递归调用
}
}
}
int main() {
print_permutation(4, A, 0);
return 0;
}
这道题递归是怎么实现的?我尝试自己手算了好多遍,都是只能输出1,2,3,4啊。。。我理解的是每递归一次cur就+1,到等于4时就结束了,然后每次递归得出一个数,到最后不就是1,2,3,4吗?那些2,3,4开头的排列是怎么递归出的啊?求解!最好能说下每次递归得出什么,感激不尽!!! 展开
1个回答
展开全部
你这个程序是对的啊。
你每次到4结束之后要返回到上一级调用,然后他们可能会执行下一个循环的。
你每次到4结束之后要返回到上一级调用,然后他们可能会执行下一个循环的。
更多追问追答
追问
结束后返回上级调用是什么意思?cur重新变回0?执行下一个循环什么都不变那不是也是输出1234吗,怎么会变成2开头的排列啊,对递归不熟,求解,谢谢
追答
main 调用
print_permutation(4, A, 0)
接下来 print_permutation(4, A, 0) 有一个循环 调用
a[0] = 1 调用 print_permutation(4, A, 1) ==> 。。。。。。。。。。这里有很多
a[0] = 2 调用 print_permutation(4, A, 1) ==> 。。。。。。。。。。这里有很多
a[0] = 3 调用 print_permutation(4, A, 1) ==> 。。。。。。。。。。这里有很多
a[0] = 4 调用 print_permutation(4, A, 1) ==> 。。。。。。。。。。这里有很多
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询