首先,我下面的叙述是建立在楼主明白什么是递归调用的基础上的。对递归毫无了解的话,请先看看百度百科。
然后,进入正题。
第一个return:就是返回这个函数的调用者,这个函数执行完毕。这是一个if判断,当带排列的数列长度为1时,只有一种可能,输出,则排列结束,返回。长度不只1的时候,执行以下for。
未完待续
接着讲这个
for(i=0i<ni++){----------这个循环到底怎么个看法和顺序?
anagram(d,n-1) 怎么输出的??(这块都不明白)
temp=d[0]
for(j=1j<=n-1j++){
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=0i<NUMi++)
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=0i<ni++){//----------这个循环到底怎么个看法和顺序?
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=1j<=n-1j++){
d[j-1]=d[j]
}
d[n-1]=temp
}
}
void print(int d[]){
int i
for(i=0i<NUMi++){
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
请按任意键继续. . .
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)