文章转载自
简单地说,如果只写f[x],那就只定义了f[x]的值。因为这里的x就是符号x。
但写f[x_]的话,这里的x_就不再是x这个符号本身,而是一个模式,它可以代表任何东西。
当然还可以给模式加一些条件。
Mathematica会自动给f的定义排序,特殊的排在前面,一般的排在后面。这样,计算f[某个东西]时,它会先看这个东西是不是x;如果是的话,那就等于1;如果不是的话,再看它是不是大于0:如果是的话,那就等于3;如果不是的话,就只剩下最一般的定义,那就是等于2。
这样就可以针对自变量的不同取值范围给出不同的定义。这样在定义一些分段函数或者递归定义的函数的时候就比较方便。比如说我们可以这样定义阶乘:
我们还可以用更复杂的模式。比如说可以规定自变量的形式。下面定义的这个函数可以把只有一个元素的列表中的那个元素取出来。
还可以用两道下划线代表列表中的连续几项,三道下划线代表列表中长度可以为0的连续几项。注意
这里f[{1}]没有找到符合的定义,于是原样返回。
于是快速排序在Mathematica中可以这样写:
有人抱怨Mathematica语言可读性不好。但在我看来,模式匹配是大大提高了可读性的。