不用循环输出1-1000的整数

答案必然是依赖于递归,标准答案就是用递归写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次调用。如此,要么在堆栈段递归,要么在代码段递归。这种宏写法看上去很不可靠似的,实际上,尽管宏比递归函数死板得多,代码段的大小却比起堆栈段要灵活的多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值