G-Spider 发表于 2013-5-1 21:53:11

不同程序员如何编写阶乘函数

不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题,不同的程序员编出的代码显示出了不同的风格,代码都很简单,有趣,

以下是Mathematica代码

(*编程新手*)
fact1:=Which,True,Return]];
Print]

(*Pascal程序员*)
fact2:=Module[{res =1,i =2},While;Return];
Print]

(*C程序员*)
fact3:=Module[{res =1, i},For;Return];
Print]

(*看过SICP的程序员*)
fact4:=If];(*此处用了尾递归和默认参数*)
Tablei],{i,10}]

(*有一定Mathematica经验的程序员*)
fact5:=Module[{res =1},Do; res];
(*Mathematica中不推荐用For或者While的,执行效率较低*)
Tablei],{i,10}]

(*懒惰的程序员*)
fact6:=If];
fact6 /@Range

(*更懒的*) fact7 =If[#<1,1,#*#0[#-1]]&;
fact7 /@Range

(*数学系的*)
fact8=1; fact8:= x*fact8;
fact8 /@Range

(*Mathematica专家*)
fact9 =FoldList[#1*#2&,1,Range]&;(*类似Python里面的reduce*)
fact9

(*黑客*)
fact10 =Times@@Range[#]&;
fact10~Map~Range@10

(*专家级别*) fact11:=Gamma
(*伽玛函数是作为阶乘的延拓,阶乘是其特例*)
10// fact11

(*大英帝国程序员*)
fact12:=Product;
(*Product是连乘函数,阶乘当然是连乘*)
fact12@10

(*喜欢恶搞的程序员*)
fact13:=Length@Permutations@Range@x;(*x个元素的全排列长度为x!,很低效且占内存*)
fact13@10

(*喜欢用模式匹配的人*)
fact14:={1, x}//.{a_,b_/; b >0}:>{b a, b -1}//First;
fact14

(*最懒的*)
fact15 =#!&;(*!是专门计算阶乘的内置函数Factorial的简写*)
fact15@Range@10

wayne 发表于 2013-5-1 23:26:17

1# G-Spider
Fold可以这样用:Fold]FoldList]qq = Fold] &
qq

wayne 发表于 2013-5-1 23:35:14

动态规划:f = i = 1; Table = f*i, {10}]

mathematica 发表于 2013-5-2 09:58:52

我是典型的c语言的

chyanog 发表于 2013-5-3 17:08:31


Nest[#*i++ &, i = 1, 10]
f //. {f -> 1, f -> n f}
t = i = 1; Table // Last
# & @@ Nest[{#*#2, #2 + 1} & @@ # &, {1, 1}, 10]

G-Spider 发表于 2013-5-3 22:54:41

perl新手,我也来两个。
code 1(递归):sub factorial {
return !(\$_/2) || \$_*factorial(\$_-1);
}
print factorial 10;code 2(支持控制台输入n):\$n=\$n*\$_||1 for (0..<>);
print \$n;

gxqcn 发表于 2013-5-4 08:45:57

刚才对最后一跟帖重新排版编辑,不知何故,之前的所有跟帖全部消失!!!:'( 对不住大家了

//=====================================================

刚才再刷新了下,居然又有了,惊喜!;P
页: [1]
查看完整版本: 不同程序员如何编写阶乘函数