永发信息网

全排列问题

答案:2  悬赏:10  手机版
解决时间 2021-11-21 04:33
  • 提问者网友:活着好累
  • 2021-11-20 10:48
全排列问题
最佳答案
  • 五星知识达人网友:过活
  • 2021-11-20 10:58
这个代码有问题,修改一下
void perm(int list[], int k, int m)
{
int i;

if (k==m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
n++;
}
else
{
for(i=k; i<=m;i++)
{
swap(&list[k], &list[i]);
perm(list,k+1,m);
swap(&list[k], &list[i]);
}
}
}
这样才能求出非3位数组的全排列

思路:假设N个数的全排列是perm(list, 1, N),即从第1个开始到第N个数的全排列,那么它的解可以划分为子问题:当第一位确定是某个数的时候,其余数的全排列。
假设第一位确定是数组中第i个数的时候,将数组第1个数与第i个数交换位置,则需求perm(list', 2, N),即调整位置后的数组第2个至第N个的全排列。
逐渐划分子问题,到数组最后一个数时,它的全排列就是它本身,递归到底,这样就可以将前方排列好的输出了

程序swap(int *a, int *b)交换两个数字不解释,perm(int list[], int k, int m)将数组list从k位到m位进行全排列。首先确定首位是数组中的哪个数字,将其换至第一位,然后递归求交换过的数组剩下的数字的全排列,递归完成再把那两个数换回来,再用另一个数字当作首位,以此类推追问for(i=k; i<=m;i++)
{
swap(&list[k], &list[i]);
perm(list,k+1,m);
swap(&list[k], &list[i]);在循环中 k的值和 i 的值 始终是相等的交换没有意思?追答i=k这是初始化,之后每次循环i加1,k值不变
第一次的时候,i=k交换是没有什么意义,不过为了代码简洁一些,这样写比较方便追问但是调用的函数本身 perm(list,k+1,m); 这样不就让K值也跟着加1了么追答拜托,k+1是传给perm的值,k本身又不加1
k=k+1才是k加1,没有赋值的时候k值是不会变化的追问可以加你QQ么? 我在QQ里问你追答我感觉你好象对于C语言的语法都不太熟悉,所以建议你先看看语法,搞明白每一句在说什么,然后再研究算法的事情。就跟学英语一样,单词还不会就学写论文,这难了点
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯