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

include<stdio.h> #define ____ int #define o double #define O(x) printf("%c",x) #define (x) 1.0+1199.0x/12.0-799.0xx/24.0+55.0xxx/12.0-5.0xxxx/24.0 main(_ ) { o _;if(!)main(1);else if(==6)return;else{=();O((___)(+0.5));main(+1);} } </stdio.h>

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

include<stdio.h> int main(int argc) { int x; double ans; if(argc0) main(1); else{ x=argc; if(x6) return; else{ ans=1.0+1199.0x/12.0-799.0xx/24.0+55.0xxx/12.0-5.0xxxx/24.0; printf("%c",(int)(ans+0.5)); main(x+1); } } } </stdio.h>

现在看明白了么?
关键就是这句
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的本身递归模式。囧