Mathematica/范式
外观
Mathematica 允许使用多种方法进行编程。考虑以下示例:我们想要一个 1 ≤ x ≤ 5、1 ≤ y ≤ 5 的 gcd(x, y) 值表。
最简洁的方法是使用众多专门函数之一
In[3]:= Array[GCD, {5, 5}] Out[3]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}
至少还有三种方法可以实现这一点
In[4]:= Table[GCD[x, y], {x, 1, 5}, {y, 1, 5}] Out[4]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}
一种APL 风格的方法
In[5]:= Outer[GCD, Range[5], Range[5]] Out[5]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}
Outer对应于广义的外积运算符。Range对应于 iota 运算符。Outer允许使用通用函数,无论它们是命名的,还是匿名的。匿名函数使用#n作为函数参数,并附加一个 &。上面的函数可以等效地指定为Outer[GCD[#1, #2] &, Range[5], Range[5]].
使用循环的方法
In[6]:= l1 = {}; (* initialize as empty list, since we want a list in the end *) Do[l2 = {}; Do[l2 = Append[l2, GCD[i, j]], {j, 1, 5}]; l1 = Append[l1, l2], (* append the sublist, that is, the row *) {i, 1, 5}]
In[7]:= l1 Out[7]= {{1, 1, 1, 1, 1}, {1, 2, 1, 2, 1}, {1, 1, 3, 1, 1}, {1, 2, 1, 4, 1}, {1, 1, 1, 1, 5}}
注意,此解决方案比之前的解决方案要大得多。