跳至内容

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}}

注意,此解决方案比之前的解决方案要大得多。

华夏公益教科书