帮忙看个C程序(递归类型)

来源:百度知道 编辑:UC知道 时间:2024/06/28 23:52:24
#include <stdio.h>
#include <string.h>

char string[9];
int used[9]={0};
char output[9];
int length;

void F(int d)
{
int i;
for(i=0;i<=length;i++)
{
if(!used[i])
{
used[i]=1;
output[d]=string[i];
if(d==length)
{
for(d=0;d<length;d++)
printf("%c ",output[d]);
printf("%c\n",output[length]);
}
else
F(d+1);
used[i]=0;
}
}

}

int main(void)
{
scanf("%s",&string);

length=strlen(string)-1;

F(0);

return 0;
}
显然,这是个全排列的程序,我跟踪了程序,发现变量I从2突然回到了0,觉得很纳闷,我输入了3个数,length应为2,for(i=0;i<=length;i++), I已经到2了,应该退出循环才对,咋会又回到0了呢?
本人在程序运行过程中添加了输出i,d的语句,跟踪如下
我输入了a,b,c
结果
a b c
2,2
1,1,2
a c b
1,2
2,1
0,0
b a c
2,2
0,1
b c a
0,2
2,1
1,0

这个是个递归调用,在不同的调用层次里i的值都是互不相关的,这里说说不大清楚,你仔细注意d变量,那个是能代表你当前进入的递归层次的标志:
2,2
0,1
你说2突然变成0,你看d也2变成1了,已经不在同一个调用里了,在递归的程序里跟踪特别要注意当前是在那一个调用里,否则一个不小心就晕了

先留个记号
下课在来看