无声无息的在各种技术类社区混迹了不少时间了,从来没有自己动手写过什么东西。究其原因还是自己水平有限。为了敦促自己不断的学习进步,今天就在这儿开始自己的博客吧。。。
一次瞎逛时,看到了一个关于全排列的文章(点击打开链接),因为自己还是不喜欢看别人的代码,再有就是也想检验自己的水平,所以就自己琢磨着写写试一试。说实话写代码之前递归自己还真不了解。自己大概按着那篇文章的作者的“全排列就是从第一个数字起每个数分别与它后面的数字交换”的思路来瞎倒腾。经过一段时间的写---改---写---改之后最终还是实现了功能。还是先附上代码吧,有码才有真相。
#include<stdio.h>
#include<string.h>
int main()
{
char what[] = {"123"};// the array to be all arranged.
int len;
void swap(char *m, char *n);// swap the value of two data.
void full(int n, int len, char a[]);
len = strlen(what);// get the length of the array.
full(len, len, what);
getchar();
getchar();
return 0;
}
void swap(char *m, char *n)
{
char tmp;
tmp = *m;
*m = *n;
*n = tmp;
}
void full(int n, int len, char a[])
{
char temp[6];
int i;
static int j = 1;
if(n == 1)
{
swap(&a[len-2], &a[len-1]);
printf("\t%d:%s\n", j++, a);
}
else
{
for(i=len-n; i<len; i++)
{
swap(&a[len-n], &a[i]);
strcpy(temp, a);
full(n-1, len, temp);
}
}
}
写这篇文章是想分享一下自己对全排列递归实现的理解。
如图最左边黄色部分,函数 full(3,3,"123") 入栈时在for循环只执行了一次(函数 full(3,3,"123") 循环三次)就再次调用函数自身,此时full(3,3,"123")函数保存现场然后执行函数 full(2,3,"123") ,而函数 full(2,3,"123") 在入栈时也只执行了一次(函数full(2,3,"123")循环两次)就再次调用函数自身,此时函数 full(2,3,"123") 保存现场然后执行函数 full(1,3,"123") ,而执行 full(1,3,"123") 也就完成了第一次输出: 132。 程序不断恢复如上图红色部分伪代码所示的之前保存的现场,最后实现输出:
第一次写东西,望包涵,指教。。。