 余辉 余辉
- 
 首先,我下面的叙述是建立在楼主明白什么是递归调用的基础上的。对递归毫无了解的话,请先看看百度百科。
 然后,进入正题。
 第一个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()轻松搞定 
