Mathematica中如何定義f[x+y]=f[x]+f[y]?

我直接輸入f[x+y]:=f[x]+f[y],然後輸入f[3+1]輸出的是f[4]

我用的是10.4版本


f[Verbatim[Plus][a__]] := Plus @@ f /@ {a}
SetAttributes[f, HoldAll]


題主看來是 mathematica 新手啊…這貌似是 mathematica 里非常基礎的一個問題(當然我剛玩的時候也老犯這類錯誤)。

題主定義的函數 f 的問題在於:f 作用的內容只有是『x+y』的時候才有定義,注意是準確的『x+y』這個表達式而不是『任意的 x 和 y』。因此,你換一個對象它就不認識了:

In[1]:= f[x + y] := f[x] + f[y];

In[2]:= f[a + b]

Out[2]= f[a + b]

解決方案是:用一個簡單的模式:

In[1]:= f[x_ + y_] := f[x] + f[y];
SetAttributes[f, HoldAll]

In[2]:= f[a + b]

Out[2]= f[a] + f[b]

In[3]:= f[1 + 3]

Out[3]= f[1] + f[3]

下劃線 _(Blank) 的意思是『任意表達式』,它可以匹配單個的表達式,這樣就解決了。

樓上 @happy fish 的答案比較高端,直接給出了任意表達式序列的 f。

其他模式還有__、___ 等等,題主可以看看官方教程:[模式](Patterns | Wolfram Language Fast Introduction for Programmers)、[函數定義](Function Definitions)

注意要『 SetAttributes[f, HoldAll] 』,不然 f[1+3]會先計算1+3=4.

我也剛玩 mathematica 沒多久,歡迎指正。

希望對題主有幫助。


Attributes@f = HoldAll;
f[a_Plus] := f /@ Unevaluated@a

……寫完了才想起來上面這種複雜的寫法其實毫無必要。最簡單的就足夠了:

ClearAll[f];
Attributes@f = HoldAll;
f[x_ + y_] := f[x] + f[y]
f[a + b + c]
(* f[a] + f[b] + f[c] *)

因為Plus擁有屬性Flat和OneIdentity。


推薦閱讀:

如何在Unity中實現MVC模式?
同名的全局變數在循環體中怎麼引用?
請問你們能熟練使用的編程語言有那些?
學編程的時候都會先學進位轉換,請問在實際編程過程中,這些東西有用么?
為什麼google編程風格指南設置縮進為2個空格?

TAG:數學 | 編程 | WolframMathematica |