- 余辉
-
首先,我下面的叙述是建立在楼主明白什么是递归调用的基础上的。对递归毫无了解的话,请先看看百度百科。
然后,进入正题。
第一个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(" i = %d,n = %d, 准备调用aragram(d,%d) ",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(" ");
}
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
请按任意键继续. . .
- 永节芜贱买断之之耻
-
#include<stdio.h>
main(){
int i S;
S=S*i;
for(i=0;i<n;i++)
printf("S ",i,S);
}
- 北境漫步
-
首先,我下面的叙述是建立在楼主明白什么是递归调用的基础上的。对递归毫无了解的话,请先看看百度百科。
然后,进入正题。
第一个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(" i
=
%d,n
=
%d,
准备调用aragram(d,%d) ",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(" ");
}
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
请按任意键继续.
.
.
- 苏州马小云
-
for()轻松搞定