朋友,你这个取走归还的想法非常好啊。开眼界了。
我刚刚也写了一个,不是用递归,是先前我说的循环回溯。
请指点
int *para;
int count = 0;
int Local(int local, int length);
int checkEnd(int length);
void main()
{
int i, j, length;
char element[] ="abcdef";
length = 6;
para = (int *)malloc(sizeof(int) * length);
for(i = 0; i < length; i++)
para[i] = i;
while(1)
{
if(i == length) /* 输出结果 */
{
for(j = 0; j < length; j++)
printf("%2c", element[para[j]]);
printf("\n");
if((count++)%10 == 9)
{
printf("PRESS ANY KEY!\n");
getch();
}
if(checkEnd(length))
break;
i--;
}
else /*对第i位上的重新赋值*/
{
para[i] = Local(i, length); /*赋值*/
if(para[i] >= length) /*越界,向上回溯*/
{
for(j = i; j < length; j++)
para[j] = -1;
i--;
}
else /* 合法,继续 */
i++;
}
}
printf("__________END__________\n");
getch();
}
int Local(int local, int length)
{
int i, j;
for(i = (para[local] + 1); i < length; i++) /*此位上的值*/
{
for(j = 0; j < local; j++) /*与前面的值比较*/
if(para[j] == i)
break;
if(j >= local)
break;
}
return i;
}
int checkEnd(int length)
{
int i;
for(i = 0; i < length; i++)
if(para[i] != (length - 1 - i))
return 0;
return 1;
}