配色: 字号:
递归实现全排列
2012-10-21 | 阅:  转:  |  分享 
  
递归实现全排列.txt10有了执著,生命旅程上的寂寞可以铺成一片蓝天;有了执著,孤单可以演绎成一排鸿雁;有了执著,欢乐可以绽放成满圆的鲜花。虽说这是个蛮基础的东西

但这个鸟东西困扰了我十年了今天终于解决了~

惭愧啊实际上问题并不在于全排列问题本身

而是在于basic中的goto

当年basic中的方法是搜索回溯

十来行的代码里面三个goto搞的人团团转

最后终于彻底失去了继续参加竞赛的兴趣和动力

然后一晃就是十年



今天正在看programminginlua

又见这个鸟问题是用lua实现的递归算法

看了英文原版的书如醍醐灌顶豁然开朗

原来这么简单!



打印数组a{1,2,...,n}的全排列



递归思想:

取出数组中第一个元素放到最后,即a[1]与a[n]交换,然后递归求a[n-1]的全排列



1)如果数组只有一个元素n=1,a={1}则全排列就是{1}

2)如果数组有两个元素n=2,a={1,2}则全排列是

{2,1}--a[1]与a[2]交换。交换后求a[2-1]={2}的全排列,归结到1)

{1,2}--a[2]与a[2]交换。交换后求a[2-1]={1}的全排列,归结到1)

3)如果数组有三个元素n=3,a={1,2,3}则全排列是

{{2,3},1}--a[1]与a[3]交换。后求a[3-1]={2,3}的全排列,归结到2)

{{1,3},2)--a[2]与a[3]交换。后求a[3-1]={1,3}的全排列,归结到2)

{{1,2},3)--a[3]与a[3]交换。后求a[3-1]={1,2}的全排列,归结到2)

...

以此类推。

马上用C代码实现,成功!



#include

intg_count=1;

intg_n=0;



voidprint_result(inta)

{

inti=0;



printf("count%d:",g_count++);

for(i=0;i
{

printf("%d",a[i]);

}



printf("\n");

return;

}



#defineswap(a,b)\

{\

inttmp=a;\

a=b;\

b=tmp;\

}



voidp(inta,intsize)

{

if(size==1)

print_result(a);

else

{

inti,tmp=0;

for(i=0;i
{

swap(a[i],a[size-1]);

p(a,size-1);

swap(a[i],a[size-1]);

}

}

return;

}



voidmain(void)

{

intarray[]={1,2,3,4};

g_n=sizeof(array)/sizeof(int);

p(array,g_n);

return;

}

献花(0)
+1
(本文系依米荷阳首藏)