由“输出从1到1000的数”想到的

本文探讨了在C/C++中不使用循环、条件判断或重复输出的限制条件下,通过递归实现从1到1000的数字打印。文章详细介绍了三种递归方法,包括修改除法操作防止程序崩溃、宏实现和利用main函数进行递归调用,最终解释了程序参数初始化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

酷壳看到一个编程题目——请把从1到1000的数打印出来,不能使用任何的循环语句或条件判断语句,更不能写1000个printf和cout,用C/C++语言。

最容易想到的是用递归,文中给出了一个例子:

#include <stdio.h> void f(int n) { printf("%d/n",n); n/(1000-n); f(n+1); } void main() { f(1); }

该程序的本意是在n==1000时,n/(1000-n)的分母为0,使程序崩溃,从而结束递归。

不过用gcc编译执行时,并没有出现崩溃,而是一直输出。

只有将分母为0的除式赋值给一个变量时,程序才会崩溃,更改如下:

#include <stdio.h> int tmp=0; void f(int n) { printf("%d/n",n); tmp=n/(1000-n); f(n+1); } void main() { f(1); }

还有一个用宏实现的方法,不得不感叹宏的强大:

#include<stdio.h> #define Out(i) printf("%d/n", i++); #define REP(N) N N N N N N N N N N #define Out1000(i) REP(REP(REP(Out(i)))) void main() { int i = 1; Out1000(i); }

最后与一个很BT的:

void main(int j) { printf("%d/n", j); (main + (exit - main)*(j/1000))(j+1); }

这也是一个递归,利用main函数作为递归函数,

当j<1000时,j/1000为0,因为j是int型,所以执行:

(main+(exit-main)*0)(j+1);

也就是

main(j+1);

当j=1000时,j/1000为1,执行:

(main+(exit-main)*1)(1000+1);

main和exit都是函数名,即函数在内存中的地址,是可以做加减运算的,所以这时执行:

exit(1000+1);

程序退出,结束递归。

为什么j的初始值为1呢?

因为带参数的main函数的原型是:

main(int argc, char **agrv);

这里省略了第二个参数,j就是argc,程序执行是不带参数,j就是1。

所以,该程序要想真正执行,是不能带参数的。

受益匪浅!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值