主页 > 程序人生 > 趣味:c语言递归main函数打印hello字样

趣味:c语言递归main函数打印hello字样

今天下午没课,正好想起一个比较蛋疼的事情可以做,就是玩c语言的main函数递归。
首先还是说一下我的编译环境,哪些用m$的c语言编译器的朋友可以忽略这个文章了,放心吧,正常情况下是编译不通过的。。。
我的gcc版本是4.2.1。
先贴上代码~

1
2
3
4
5
6
7
8
9
#include<stdio.h>
#define ____ int
#define _o_ double
#define _O_(x) printf("%c",x)
#define ___(x) 1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0
main(____ __)
{	
	_o_ _;if(!__)main(1);else if(__==6)return;else{_=___(__);_O_((____)(_+0.5));main(__+1);}
}

跑出来就是一个不换行的Hello
哈哈,这个代码看着很恶心吧。好吧,让我给你翻译一下~如果我把上述代码的define还有一些变量整理一下,那就是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main(int argc)
{	
	int x;
	double ans;
	if(argc==0)
		main(1);
	else{
		x=argc;
		if(x==6)
			return;
		else{
			ans=1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0;
			printf("%c",(int)(ans+0.5));
			main(x+1);
					}
	}
}

现在看明白了么?
关键就是这句
ans=1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0;
这个通项正是有穷数列72,101,108,108,111的通项。那么我是如何得到这个表达式的呢?
很简单,用多项式的拉格朗日插值公式就可以解决这个问题。
先把公式贴上来。

至于这个公式是怎么推导出来的,你可以看看这篇论文,讲解的很详细,这里就不复制过来了,哈哈
http://www.lw23.com/pdf_d659df85-fb38-47e6-ac02-147a12d2bab3/lunwen.pdf
有了这个通项就简单了,只要不断递归main函数,理论上可以答应出任意的函数出来。
ps:我求通项的时候用Mathematica来计算的,毕竟当数据多了,展开是个很麻烦的事情。。。然后又先用python写了个函数验证了通项正确后才改写成c的本身递归模式。囧

相关日志

, , , , , , , , ,

评论:7

参与评论
  1. 回复 Baryn
    10/09/21

    囧。。代码白表示啥也不懂

    • 回复 混沌的云
      10/09/21

      哈哈,此文关键在于拉格朗日插值公式,可以求任意有穷数列的通项~

  2. 回复 zypatroon
    10/09/21

    飘走. 我作为当事人今天很蛋疼.

  3. 回复 cynthia
    10/09/22

    大叔,未来的数学家,膜拜一下先~

  4. 回复 Freddy
    12/02/03

    很不錯耶,可以參加世界最亂代碼大賽了

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的链接
趣味:c语言递归main函数打印hello字样 来自 混沌的云
顶部