递归算法
inline void Swap(char& a, char& b)
{// 交换a和b
char temp = a;
a = b;
b = temp;
}
void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++)
putchar(list[i]);
putchar('\n');
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++) {
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);
}
}
/* By Nathan from if-else.org, Jun 29 */
#include<stdio.h>
#include<string.h>
#define pop(str) strcpy(str, stack[--top])
#define push(str) strcpy(stack[top++], str)
#define N 5
inline static char* insert( char* str, int i ); /* insert a new char to the str at position i */
static char str[N+1], stack[N*(N-1)/2][N+1], tmp_str[N+1];
static int len, top;
int main ()
{
push("1"); /* push the root */
while( top > 0 ) { /* exit after all leaves have been visited */
pop(str);
if( (len = strlen(str)) >= N )
printf( "%s\n", str ); /* current node has reached the leaf */
else
for( int i = 0; i <= len; i++ ) /* keep pushing brothers */
push( insert( str, i ) );
}
return 0;
}
inline static char* insert( char* str, int i )
{
strcpy(tmp_str,str);
for( int j = len; j >= i; j--)
*(tmp_str + j + 1) = *(tmp_str + j);
*(tmp_str+i) = len + '1'; /* len+'1' happens to indicate the number to insert*/
return tmp_str;
}
非递归算法