当前位置:首页 » 编程语言 » c语言全排列递归

c语言全排列递归

发布时间: 2022-09-03 12:44:46

1. c语言的全排列问题!急!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int hash[27];
char word[201];
int n;
void dfs(int cur)
{
if(cur>=n)
{
printf("%s\n",word);
return ;
}
int i;
for(i=0;i<26;i++)
if(hash[i])
{
hash[i]--;
word[cur]=i+'a';
dfs(cur+1);
hash[i]++;
}
return ;
}
int main()
{
int i;
scanf("%s",word);
n=strlen(word);
memset(hash,0,sizeof(hash));
for(i=0;i<n;i++)
hash[word[i]-'a']++;
dfs(0);
return 0;
}

楼主看一下,输入一行字符,输出全排列,多个案例的话最外面加个while循环就是了

2. 求解C/C++一个字符串的递归全排列的问题

Swap(list[k],list[i]);//从第一个元素起,后面的元素依次与第一个元素交换.
Perm(list,k+1,m);//递归调用,直至一个全排列完成,即k等于m.
Swap(list[k],list[i]);//将第一个Swap所换过的元素进行还原,防止遗漏和重复.

// 如果你懂得河内塔(汉诺塔)递归的整个内部执行过程,那么这个全排列的递归(包括组合数的递归)就很简单了。

3. C语言如何实现有重复元素的全排列

在递归里面用交换的方式获取全排列,从第一个开始,不断与后面数交换,当然递归时不要忘记在后面写个换回来的语句。只要加个交换条件就可以了,在不相等时交换,相等时不交换。

当前阶段,在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。计算机系统设计以及应用程序编写是C语言应用的两大领域。同时,C语言的普适较强,在许多计算机操作系统中都能够得到适用,且效率显着。

C语言拥有经过了漫长发展历史的完整的理论体系,在编程语言中具有举足轻重的地位。



特有特点

C语言是普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点,因此相对于其它编程语言,它具有自己独特的特点。具体体现为以下三个方面:

其一,广泛性。C语言的运算范围的大小直接决定了其优劣性。C语言中包含了34种运算符,因此运算范围要超出许多其它语言,此外其运算结果的表达形式也十分丰富。此外,C语言包含了字符型、指针型等多种数据结构形式,因此,更为庞大的数据结构运算它也可以应付。

其二,简洁性。9类控制语句和32个关键字是C语言所具有的基础特性,使得其在计算机应用程序编写中具有广泛的适用性,不仅可以适用广大编程人员的操作,提高其工作效率,同时还能够支持高级编程,避免了语言切换的繁琐。

其三,结构完善。C语言是一种结构化语言,它可以通过组建模块单位的形式实现模块化的应用程序,在系统描述方面具有显着优势,同时这一特性也使得它能够适应多种不同的编程要求,且执行效率高。

4. C语言中全排列问题思路

方法1:如果位数不多穷举
方法2:位数多建议递归。

5. c语言,递归1~n按字典顺序全排列

#includevoidswap(char&a,char&b,charc){c=a;a=b;b=c;}voidperm(char*list,inti,intn){intj,temp;if(i==n){for(j=0;j<=n;j++)printf("%c",list[j]);printf("");}else{for(j=i;j<=n;j++){swap(list[i],list[j],temp);perm(list,i+1,n);swap(list[i],list[j],temp);}}}voidmain(){charlist[3]={'A','B','C'};perm(list,0,2);}

6. C的递归的全排列问题(不知道的哪凉快上哪去,别在这哔哔乱吠!不懂装懂,让人恶心)。

简单的说递归就是一个入栈和出栈的过程,但这个里面有循环,所以有点复杂

#include <stdio.h>

void Perm(char *list, int k, int m)
{
int i;
char t;

if (k == m)
{
puts(list);
}
else
{
for (i=k; i<m; i++)
{
t = list[i];
list[i] = list[k];
list[k] = t;

Perm(list, k+1, m);

t = list[i];
list[i] = list[k];
list[k] = t;
}
}
}

void main(void)
{
Perm("123", 0, 3);
}

为了简便,我只对123进行全排列

这个里面有两次交换,第一个交换函数是发生在入栈过程,第二个交换函数是发生在出栈过程
--(A)-->表示调用第一个交换函数后,--(B)-->表示调用第二个交换函数后

第一次调用Prem函数一共有三次循环,分别是(1)k =0, i = 0; (2)k = 0, i = 1; (3)k = 0, i = 2
我只给你讲第一次循环过程,后两次自己分析

入栈过程:
Prem --> (k=0,i=k) --(A)--> 内容"123" --> Prem --> (k=1,i=k) --(A)-->内容"123" --> Prem --> (k=2,i=k) --(A)--> 内容"123" --> Prem -->k=3输出
开始退栈:
--> (k=2,i=k) --(B)--> 内容"123"(注意:这里此后还要执行一次i++,但i=3不满足i<3,退出循环,后面我都会省略掉) --> (k=1,i=k) --(B)--> 内容"123" --> i++(此时i=2,而k=1)
又一次入栈(这是中间时候的入栈,排列数越多,中间入栈的次数越多,三个数排列只有一次中间入栈过程)
--> (k=1,i=2) --(A)--> 内容"132" --> Perm --> (k=2,i=k) --(A)--> 内容"132" --> Prem --> k=3输出
又开始退栈
--> (k=2,i=k) --(B)--> 内容"132" --> (k=1, i=2) --(B)-->内容"123" -->最后到达第一次循环的起始点,在执行i++进行第二次循环

楼主因该发现第一次交换是对里面数据的交换,产生排列组合
第二个交换是还原最初的输入数据

第一次循环123首先把1单独放出来,对2和3交换(也就是中间入栈过程)
第二次循环123首先把2单独放出来,对1和3交换
第三次循环123首先把3单独放出来,对1和2交换

7. C语言 求此全排列递归算法解析

used数组是全局变量有隐含初值0;
关于全排列的算法你可以理解为深搜加回溯。
#include<stdio.h>
#define
MAX
10
int
used[MAX];
//用来标记数字是否已经在前面使用过
int
result[MAX];
//存放结果
int
N;
void
print()
//输出结果
{
int
i;
for(i=0;i<N;i++)
printf("%d
",result[i]);
printf("\n");
}
void
proc(int
step)
//step用来记录已经摆好了几个数
{
int
i;
if(step==N)
//如果已经摆好了N个数,那么结果就产生了,就输出结果
print();
else
{
for(i=0;i<N;i++)
//枚举1-N,找到没有使用过的最小的数
{
if(!used[i])
//没有使用过
{
used[i]=1;
//标记i已经使用
result[step]=i+1;
//记录结果
proc(step+1);
//递归求解
used[i]=0;
//这里就是所谓的回溯,也许比较难理解,你可以人工走一遍加深理解。其实回溯的主要想法是"还原现场".当执行到这一步时,i+1
这个数放在第step个位置的情况已经解决了,我们就要拿出i+1这个数,把它标记为未使用。
}
}
}
}
int
main()
{
scanf("%d",&N);
proc(0);
return
0;
}

8. 全排列递归算法

希望我的答复可以帮助你加深理解:

第一,perm函数中的条件for(int i=k;i<=m;i++)应更正为 for(int i=k;i<m;i++)

第二,你可以在核心步骤的前后打印有关变量的值,分析查看每一步的具体执行情况,这是编程调试的重要能力,要加强。
第三,以下是我提供的附件程序及运行结果(以1,2,3这个数组的全排列),可辅助分析:

1. 程序源码=================================================
#include <stdio.h>
#include <stdlib.h>
int N,P=0;

void swap(int a[],int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}

void perm(int a[],int k,int m,int pk,int pm)
{
int i;
/*k为中间变量,m初始化为参与排列元素的起始坐标和终止坐标
pk,pm分别表示参与排列元素的起始坐标和终止坐标,整个递归过程保持不变*/
if(k==m)
{
printf("----->perm %d :\n",P/N+1);/*打印提示*/
for(i=pk;i<pm;i++)
{
printf("%d ",a[i]);
P=P+1;
}
printf("\n\n");
}
else
{
for(i=k;i<m;i++)
{
printf("a %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
swap(a,k,i);
printf("b %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
perm(a,k+1,m,pk,pm);
printf("c %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
swap(a,k,i);
printf("d %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
}
}
}

int main()
{
/*调节以下N值及对应数组内容,可打印对应数组对应的全排列*/
N=3;
int t[]={1,2,3};
/*调节以上N值及对应数组内容,可打印对应数组对应的全排列*/

perm(t,0,N,0,N);
printf("----->Over!\n");/*打印提示*/
system("pause");
return 0;
}

2.打印结果 ============================================================

a 0,0,1,2,3
b 0,0,1,2,3
a 1,1,1,2,3
b 1,1,1,2,3
a 2,2,1,2,3
b 2,2,1,2,3
----->perm 1 :
1 2 3

c 2,2,1,2,3
d 2,2,1,2,3
c 1,1,1,2,3
d 1,1,1,2,3
a 2,1,1,2,3
b 2,1,1,3,2
a 2,2,1,3,2
b 2,2,1,3,2
----->perm 2 :
1 3 2

c 2,2,1,3,2
d 2,2,1,3,2
c 2,1,1,3,2
d 2,1,1,2,3
c 0,0,1,2,3
d 0,0,1,2,3
a 1,0,1,2,3
b 1,0,2,1,3
a 1,1,2,1,3
b 1,1,2,1,3
a 2,2,2,1,3
b 2,2,2,1,3
----->perm 3 :
2 1 3

c 2,2,2,1,3
d 2,2,2,1,3
c 1,1,2,1,3
d 1,1,2,1,3
a 2,1,2,1,3
b 2,1,2,3,1
a 2,2,2,3,1
b 2,2,2,3,1
----->perm 4 :
2 3 1

c 2,2,2,3,1
d 2,2,2,3,1
c 2,1,2,3,1
d 2,1,2,1,3
c 1,0,2,1,3
d 1,0,1,2,3
a 2,0,1,2,3
b 2,0,3,2,1
a 1,1,3,2,1
b 1,1,3,2,1
a 2,2,3,2,1
b 2,2,3,2,1
----->perm 5 :
3 2 1

c 2,2,3,2,1
d 2,2,3,2,1
c 1,1,3,2,1
d 1,1,3,2,1
a 2,1,3,2,1
b 2,1,3,1,2
a 2,2,3,1,2
b 2,2,3,1,2
----->perm 6 :
3 1 2

c 2,2,3,1,2
d 2,2,3,1,2
c 2,1,3,1,2
d 2,1,3,2,1
c 2,0,3,2,1
d 2,0,1,2,3
----->Over!
请按任意键继续. . .

9. 递归全排列 c语言 看不懂

perm(list,i,j)是一个全排列函数,拿你上面的列子来说:
perm(list,0,5)意思是数组list的前6个数(第0个数到第5个数)的所有排列,它细分的话就等于:第0个数和第1个数互换以后的perm(list,1,5) 第0数和第2数互换perm(list,1,5) ....第0数和第5数互换的perm(list,1,5) 和它本身的所在0位置的perm(list, 1, 5)
如假如6个数是1 2 3 4 5 6
他们的排列就 * * * * * * perm(list,0,5)
1 * * * * * perm(list,1,5)
2 * * * * * perm(list,1,5)
3 * * * * * perm(list,1,5)
4 * * * * * perm(list,1,5)
5 * * * * * perm(list,1,5)
6 * * * * * perm(list,1,5) 就是每一个数都在第0个位置上面都出现一次以后的排列总和。 也就是它的for循环的意思
这只是形象的比喻一下

10. C语言递归问题(全排列)

#include <stdio.h>

void swap(char &a,char &b,char c)
{
c=a; a=b; b=c;
}

void perm (char*list,int i,int n)
{
int j,temp;
if(i==n)
{
for(j=0;j<=n;j++)
printf("%c",list[j]);
printf(" ");
}
else
{
for(j=i;j<=n;j++)
{
swap(list[i],list[j],temp);
perm(list,i+1,n);
swap(list[i],list[j],temp);
}
}
}

void main()
{
char list[3]={'A','B','C'};
perm(list,0,2);
}

热点内容
微信青少年模式独立密码是什么 发布:2025-01-22 16:52:06 浏览:587
腾讯云服务器怎么购买 发布:2025-01-22 16:45:01 浏览:628
天猫怎么上传视频 发布:2025-01-22 16:40:02 浏览:725
安卓如何把抖音评论换成黑色 发布:2025-01-22 16:30:57 浏览:700
连接池Java 发布:2025-01-22 16:28:27 浏览:258
抢杠算法 发布:2025-01-22 16:15:02 浏览:72
图片服务器ftp 发布:2025-01-22 15:52:33 浏览:507
sql打开bak文件 发布:2025-01-22 15:47:32 浏览:107
opengl服务器源码 发布:2025-01-22 15:40:02 浏览:909
python部署服务 发布:2025-01-22 15:38:46 浏览:283