找回密码
 欢迎注册
查看: 13705|回复: 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-4-25 20:28 , Processed in 0.062301 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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