博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
由“输出从1到1000的数”想到的
阅读量:2426 次
发布时间:2019-05-10

本文共 1578 字,大约阅读时间需要 5 分钟。

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

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

[cpp]
  1. #include <stdio.h>   
  2.   
  3. void f(int n)  
  4. {   
  5.     printf("%d/n",n);  
  6.     n/(1000-n);   
  7.     f(n+1);   
  8. }   
  9.   
  10. void main()  
  11. {  
  12.     f(1);  
  13. }  

 

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

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

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

[c-sharp]
  1. #include <stdio.h>   
  2.   
  3. int tmp=0;  
  4. void f(int n)  
  5. {   
  6.     printf("%d/n",n);  
  7.     tmp=n/(1000-n);   
  8.     f(n+1);   
  9. }   
  10.   
  11. void main()  
  12. {  
  13.     f(1);  
  14. }  

 

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

[cpp]
  1. #include<stdio.h>   
  2.   
  3. #define Out(i)   printf("%d/n", i++);    
  4. #define REP(N)   N N N N N N N N N N    
  5. #define Out1000(i)   REP(REP(REP(Out(i))))    
  6. void main()   
  7. {       
  8.    int i = 1;       
  9.    Out1000(i);  
  10. }   

 

最后与一个很BT的:

[c-sharp]
  1. void main(int j)  
  2. {       
  3.     printf("%d/n", j);       
  4.    (main + (exit - main)*(j/1000))(j+1);  
  5. }   

这也是一个递归,利用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。

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

 

受益匪浅!!!

 

转载地址:http://ejdmb.baihongyu.com/

你可能感兴趣的文章
万万没想到你们竟是这样的程序员 | 程序员有话说
查看>>
Java 帝国对 Python 的渗透能成功吗?
查看>>
从培训机构出来的程序员,后来都怎么样了? | 程序员有话说
查看>>
程序员写代码没激情该怎么破?
查看>>
我是如何从低端面畜到高端面霸的?
查看>>
他修过车、杀过鱼,最终进入阿里巴巴打造 9 个本地版支付宝!
查看>>
百面机器学习!算法工程师面试宝典!| 码书
查看>>
苹果无人驾驶拿 124 个工程师祭天!
查看>>
漫画 | 一个前端渣渣的成功逆袭
查看>>
与吴恩达并肩战斗,她是 AI 界的女超人!|人物志
查看>>
微信手机 WeOS 的可行性到底有多大?
查看>>
阿里面试,我挂在了第四轮……
查看>>
C++ 程序员到高级架构师,必须经历的三个阶段
查看>>
和 Java、C# 等语言对比后,Python 简直酷上天了!
查看>>
程序媛到最后,拼的到底是什么?
查看>>
笑死!996 程序员竟然做了这个梦!| 每日趣闻
查看>>
“再见,微软!”
查看>>
ARM 发布新一代 CPU 和 GPU,实现 20% 性能提升!
查看>>
技术引路:机器学习仍大有可为,但方向在哪里?
查看>>
漫画:如何给女朋友解释什么是编译与反编译
查看>>