‘壹’ 递归全排列 c语言 看不懂
Perm(list,k,m)递归的产生所有后缀是list(0:k-1),且后缀是
list(k:m)的全排列的所有排列。
‘贰’ C语言中全排列问题思路
方法1:如果位数不多穷举
方法2:位数多建议递归。
‘叁’ C语言全排列问题
这其实是一个递归
递归函数 意思是这样的
比如有n个数
1 2.。。。n
把1 从第一个开始 往后 与每个数开始交换
然后 第一个数就算定了 后面的 第2个到第n个当成一个整体
再进行这个函数递归
也就是说 第二个到第n个进行全排列
这样下去 当全排列到最后一组数 即第n个数一个的时候
递归退出条件就出来了 就可以输出全排列的值了
当然 最后别忘记把交换的数还原
再进行下一次交换 递归哦
所以最后一局的交换也是很重要的
听完我的解释 再好好琢磨一下
相信你一定会明白的 要是还是不懂可以继续追问我
‘肆’ C语言 全排列······晕
首先,我下面的叙述是建立在楼主明白什么是递归调用的基础上的。对递归毫无了解的话,请先看看网络。
然后,进入正题。
第一个return:就是返回这个函数的调用者,这个函数执行完毕。这是一个if判断,当带排列的数列长度为1时,只有一种可能,输出,则排列结束,返回。长度不只1的时候,执行以下for。
未完待续
接着讲这个
for(i=0;i<n;i++){----------这个循环到底怎么个看法和顺序?
anagram(d,n-1); 怎么输出的??(这块都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];
}
d[n-1]=temp;
}
先讲这个算法的思想,比如对abc进行全排列,那么可以看做:ab的全排列+c和ac的全排列+b和bc的全排列+a三个的组合。然后再细化,ab的全排列可以看出a的全排列+b,和b的全排列+a两个的组合。当只有一个时,就是调用if=1的那个情况,直接print。不是1的时候,就是递归调用,进行不断地分解。
这是算法思想,未完待续
两个for循环,里面的for执行一边后就是把数组的元素挨个往前挪一位,第一位到最后位,然后对前n-1位进行全排列,递归进行。从上面的算法思想中我们可以看出这样的目的和意义,就是一个类似对上面abc的分解过程,一次a到最后排bc,一次b到最后排ac,一次c到最后排ab。
就先说这么多吧。纯手打,望采纳!有问题可以补充,或者网络hi我。
我帮你改了一下代码,加了几行printf,希望可以解决你的那几个问题:
#include<stdio.h>
#define NUM 3
void anagram(int[],int);
void print(int[]);
void main()
{
int d[NUM];
int i;
for(i=0;i<NUM;i++)
d[i]=i + 1;
printf("初始化后的数组顺序是:");
print(d);
anagram(d,NUM);
}
void anagram(int d[],int n)
{
int i,j,temp;
int p;
if(n==1){
print(d); //打印函数
return;//-------------return返回哪?
} // 和下面的for怎么联系起来?
for(i=0;i<n;i++){//----------这个循环到底怎么个看法和顺序?
printf("\ni = %d,n = %d, 准备调用aragram(d,%d)\n",i,n,n-1);
printf("这时候的数组顺序是:");
print(d);
anagram(d,n-1); // 怎么输出的??(这块都不明白)
temp=d[0];
for(j=1;j<=n-1;j++){
d[j-1]=d[j];
}
d[n-1]=temp;
}
}
void print(int d[]){
int i;
for(i=0;i<NUM;i++){
printf("%d",d[i]);
}
printf("\n");
}
PS:
改动:1、print函数原来是逆序输出,改成正序输出,有利于理解;2、数组原来初始化为321,改为123,有利于理解。就改了这两个地方,加了一些printf。
你可以运行一下。
输出结果:
初始化后的数组顺序是:123
i = 0,n = 3, 准备调用aragram(d,2)
这时候的数组顺序是:123
i = 0,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:123
123
i = 1,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:213
213
i = 1,n = 3, 准备调用aragram(d,2)
这时候的数组顺序是:231
i = 0,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:231
231
i = 1,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:321
321
i = 2,n = 3, 准备调用aragram(d,2)
这时候的数组顺序是:312
i = 0,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:312
312
i = 1,n = 2, 准备调用aragram(d,1)
这时候的数组顺序是:132
132
请按任意键继续. . .
‘伍’ C语言如何实现有重复元素的全排列
在递归里面用交换的方式获取全排列,从第一个开始,不断与后面数交换,当然递归时不要忘记在后面写个换回来的语句。只要加个交换条件就可以了,在不相等时交换,相等时不交换。
当前阶段,在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。计算机系统设计以及应用程序编写是C语言应用的两大领域。同时,C语言的普适较强,在许多计算机操作系统中都能够得到适用,且效率显着。
C语言拥有经过了漫长发展历史的完整的理论体系,在编程语言中具有举足轻重的地位。
特有特点
C语言是普适性最强的一种计算机程序编辑语言,它不仅可以发挥出高级编程语言的功用,还具有汇编语言的优点,因此相对于其它编程语言,它具有自己独特的特点。具体体现为以下三个方面:
其一,广泛性。C语言的运算范围的大小直接决定了其优劣性。C语言中包含了34种运算符,因此运算范围要超出许多其它语言,此外其运算结果的表达形式也十分丰富。此外,C语言包含了字符型、指针型等多种数据结构形式,因此,更为庞大的数据结构运算它也可以应付。
其二,简洁性。9类控制语句和32个关键字是C语言所具有的基础特性,使得其在计算机应用程序编写中具有广泛的适用性,不仅可以适用广大编程人员的操作,提高其工作效率,同时还能够支持高级编程,避免了语言切换的繁琐。
其三,结构完善。C语言是一种结构化语言,它可以通过组建模块单位的形式实现模块化的应用程序,在系统描述方面具有显着优势,同时这一特性也使得它能够适应多种不同的编程要求,且执行效率高。
‘陆’ C语言全排列问题
没看完,看了第一行,就错了。
swap(参数应该是引用或者指针,否则不改变传进来的变量值)
‘柒’ C语言的全排列问题!急!
这其实是一个递归
递归函数
意思是这样的
比如有n个数
1
2.。。。n
把1
从第一个开始
往后
与每个数开始交换
然后
第一个数就算定了
后面的
第2个到第n个当成一个整体
再进行这个函数递归
也就是说
第二个到第n个进行全排列
这样下去
当全排列到最后一组数
即第n个数一个的时候
递归退出条件就出来了
就可以输出全排列的值了
当然
最后别忘记把交换的数还原
再进行下一次交换
递归哦
所以最后一局的交换也是很重要的
听完我的解释
再好好琢磨一下
相信你一定会明白的
要是还是不懂可以继续追问我
‘捌’ c语言中全排列问题
//输入一个数输出这个数所有的排列,递归做法
#include<stdio.h>
int a[100];
int n;
void output()
{
int i;
for(i=1;i<=n;i++)
printf("%3d",a[i]);
printf("\n");
}
void Swap(int &a,int &b) //注意取地址
{
int t;
t=a;
a=b;
b=t;
}
void pailie(int t)
{
int i;
if(t==n) //输出
{
output();
return ;
}
for(i=t;i<=n;i++)
{
Swap(a[i],a[t]); //交换
pailie(t+1);
Swap(a[t],a[i]); //换回
}
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
pailie(1);
}
return 0;
}