首先 应该是int i =5;
看递归体首先要看他的递归结束条件。 这里的结算条件是 n<=1
具体执行如下
i的值 代码
5 else 中的getchar()
4 else 中的getchar()
3 else 中的getchar()
2 else 中的getchar()
1 if中的 getchar() 并将最后一次输入的输出。
接下来就要执行 else 中的后半部分 putchar( next ).
因为是递归 ,所以要执行最里层的 也就是要输出 i = 2时的 next
以此输出 i=3 i=4 i= 5
这样就实现了 反向输出。
简单的递归跟踪一下就明白了, 负责的就要靠理解力了。
可用递归方式实现,代码如下:
#include
#define NUM_CHOOSE 100
#define DEN_CHOOSE 1000
void printResult(const int allow[10],int n)
{
int num[5];
int den[5];
int numChoose;
int denChoose;
long numV = 0;
long denV = 0;
for(int i=0;i<10;i++){
numChoose = (int)(allow[i]/NUM_CHOOSE)%10;
if(numChoose) {
num[numChoose-1] = i;
}else{
denChoose = (int)(allow[i]/DEN_CHOOSE)%10;
if(denChoose) den[denChoose-1] = i;
}
}
for(int i=0;i<5;i++){
numV = 10*numV + num[4-i];
}
for(int i=0;i<5;i++){
denV = 10*denV + den[4-i];
}
if(numV/denV==n){
printf("%05d/%05d\n",numV,denV);
}
}
void getFactor(int n,int k,int allow[10],int level)
{
for(int i=0;i<10;i++){// 分子
if(allow[i]!=i) continue;
for(int j=0;j<10;j++){ // 分母
if(allow[j]!=j || j==i) continue;
if(((n*i-j)+k)%10==0){
allow[i] += DEN_CHOOSE*level;
allow[j] += NUM_CHOOSE*level;
if(level==5){
printResult(allow,n);
}else{
getFactor(n,((n*i-j)+k)/10,allow,level+1);
}
allow[i] -= DEN_CHOOSE*level;
allow[j] -= NUM_CHOOSE*level;
}
}
}
return;
}
int main()
{
int nb[10] = ;
getFactor(2,0,nb,1); // 2可以改为2-79间数
}
运行结果如图: