找回密码
 欢迎注册
查看: 24058|回复: 6

[分享] 不同程序员如何编写阶乘函数

[复制链接]
发表于 2013-5-1 21:53:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
不久前,在互联网上出现了一篇有趣的文章,讲的是对于同一个问题,不同的程序员编出的代码显示出了不同的风格,代码都很简单,有趣, 以下是Mathematica代码 (*编程新手*) fact1[x_Integer]:=Which[x <1,Return[1],True,Return[x*fact1[x -1]]]; Print[fact1[10]] (*Pascal程序员*) fact2[x_]:=Module[{res =1,i =2},While[i<=x, res *= i; i = i +1];Return[res]]; Print[fact2[10]] (*C程序员*) fact3[x_]:=Module[{res =1, i},For[i=2, i <= x, i++, res *= i;];Return[res]]; Print[fact3[10]] (*看过SICP的程序员*) fact4[n_,t_:1]:=If[n ==0, t, fact4[n -1, t*n]];(*此处用了尾递归和默认参数*) Table[fact4[i],{i,10}] (*有一定Mathematica经验的程序员*) fact5[x_]:=Module[{res =1},Do[res *= i,{i, x}]; res]; (*Mathematica中不推荐用For或者While的,执行效率较低*) Table[fact5[i],{i,10}] (*懒惰的程序员*) fact6[x_]:=If[x <1,1, x*fact6[x -1]]; fact6 /@Range[10] (*更懒的*) fact7 =If[#<1,1,#*#0[#-1]]&; fact7 /@Range[10] (*数学系的*) fact8[1]=1; fact8[x_]:= x*fact8[x -1]; fact8 /@Range[10] (*Mathematica专家*) fact9 =FoldList[#1*#2&,1,Range[2,#]]&;(*类似Python里面的reduce*) fact9[10] (*黑客*) fact10 =Times@@Range[#]&; fact10~Map~Range@10 (*专家级别*) fact11[x_]:=Gamma[x +1] (*伽玛函数是作为阶乘的延拓,阶乘是其特例*) 10// fact11 (*大英帝国程序员*) fact12[x_]:=Product[i,{i,1, x}]; (*Product是连乘函数,阶乘当然是连乘*) fact12@10 (*喜欢恶搞的程序员*) fact13[x_]:=Length@Permutations@Range@x;(*x个元素的全排列长度为x!,很低效且占内存*) fact13@10 (*喜欢用模式匹配的人*) fact14[x_]:={1, x}//.{a_,b_/; b >0}:>{b a, b -1}//First; fact14[10] (*最懒的*) fact15 =#!&;(*!是专门计算阶乘的内置函数Factorial的简写*) fact15@Range@10 k.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-1 23:26:17 | 显示全部楼层
1# G-Spider Fold可以这样用:
  1. Fold[Times, 1, Range[10]]
复制代码
  1. FoldList[Times, 1, Range[10]]
复制代码
  1. qq = Fold[Times, 1, Range[#]] &
  2. qq[10]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-1 23:35:14 | 显示全部楼层
动态规划:
  1. f[0] = i = 1; Table[f[i++] = f[i - 1]*i, {10}]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-2 09:58:52 | 显示全部楼层
我是典型的c语言的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-3 17:08:31 | 显示全部楼层
  1. Nest[#*i++ &, i = 1, 10]
  2. f[10] //. {f[0] -> 1, f[n_] -> n f[n - 1]}
  3. t = i = 1; Table[t *= i++, {10}] // Last
  4. # & @@ Nest[{#*#2, #2 + 1} & @@ # &, {1, 1}, 10]
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-5-3 22:54:41 | 显示全部楼层
perl新手,我也来两个。 code 1(递归):
  1. sub factorial {
  2. return !(\$_[0]/2) || \$_[0]*factorial(\$_[0]-1);
  3. }
  4. print factorial 10;
复制代码
code 2(支持控制台输入n):
  1. \$n=\$n*\$_||1 for (0..<>);
  2. print \$n;
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-5-4 08:45:57 | 显示全部楼层
刚才对最后一跟帖重新排版编辑,不知何故,之前的所有跟帖全部消失!!! 对不住大家了 //===================================================== 刚才再刷新了下,居然又有了,惊喜!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 11:58 , Processed in 0.028845 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表