#include<stdio.h>
void f(int *a,int i,int max);
int main()
{
int n;
int a[100];
scanf("%d",&n);
f(a,0,n);
return 0;
}
void f(int *a,int i,int max)
{
if(i==max)
{
int j;
printf("<");
for(j=0;j<max;j++)
if(a[j])
printf("true,");
else
printf("false,");
printf("\b>\n");
}
else
{
a[i]=0;
f(a,i+1,max);
a[i]=1;
f(a,i+1,max);
}
}
比如输入数字4,于是max=4,而i=0,于是if语句就跳到else上面,所以a[0]=0;继续执行递归f(a,1,4);然而依然不满足if的条件,所以继续执行递归,等等。。。。我就晕了,,,不知道它怎么得出结论的。可能有些知识上我给忘了,希望有人能帮我理清下逻辑关系,谢谢啦!
这是输出 n 位二进制的所有情况吧。
递归就是不停将原有的问题划分为若干相同的子问题。
这里就是把当前位划分为两种情况,0 和 1 。
比如下面,考虑第一位取 0 的时候,将剩余的位置又当做整体让
f
来处理。if()
里就是指当箭头到达最右边的时候,把当前的情况输出来。比如第一种情况,到达最右之后就输出 n 个
false
。然后最后一次的
f
开始“归”,倒数第二个f
开始考虑 1 的情况。然后在调用一次
f
,又到了最右,再次输出这个数组这次最后一个
f
“归”后,倒数第二个f
也要“归”了,到了倒数第三个f
。以此类推计算下去。
当第一位为 0 的所有情况输出完之后,再 f 又回到第一位,开始考虑 1 的情况。
同上,计算下去。
大概就是个这么情况,这种指数级时间复杂度的算法没有什么实际意义,当了解递归就好。
【完】