答案必然是依赖于递归,标准答案就是用递归写main函数。然而,对当前的内存量来说,1000个printf语句小菜一碟,因此,这个程序可以这么写:
#include<stdio.h>
#define REC1(s) s;s;
#define REC2(s) REC1(s)REC1(s)
#define REC3(s) REC2(s)REC2(s)
#define REC4(s) REC3(s)REC3(s)
#define REC5(s) REC4(s)REC4(s)
#define REC6(s) REC5(s)REC5(s)
#define REC7(s) REC6(s)REC6(s)
#define REC8(s) REC7(s)REC7(s)
#define REC9(s) REC8(s)REC8(s)
#define REC10(s) REC9(s)REC9(s)
int main(){
int j=1;
REC10(if(j>1000)\
return 0;\
else\
printf("%d\n", j++)\
)
}
值得注意的是,这段程序在执行效率上比一般的递归要高,因为它的代码在运行前就生成好了,即1024个连续的if-else语句。
所谓的不许用循环,意思就是不准你用跳转的方式去产生1000次调用。如此,要么在堆栈段递归,要么在代码段递归。这种宏写法看上去很不可靠似的,实际上,尽管宏比递归函数死板得多,代码段的大小却比起堆栈段要灵活的多。