我發佈了一個遞歸解決方案,但後來決定刪除它,因爲從評論這聽起來像一個家庭作業問題,我通常是一個教魚對象。
您正在使用定義newMap[f_, {}] := {}
的遞歸解決方案。
Mathematica的模式匹配是你的朋友。考慮如何實現newMap[f_, {e_}]
的定義,並從那裏執行newMap[f_, {e_, rest___}]
。
最後一個提示:一旦您可以定義最後一個功能,您實際上並不需要{e_}
的情況。
UPDATE:
根據您的意見,也許這個例子可以幫助您瞭解如何應用任意的功能:
func[a_, b_] := a[b]
In[4]:= func[Abs, x]
Out[4]= Abs[x]
SOLUTION
由於OP抓了魚,可以這麼說,(恭喜!)這裏有兩個遞歸解決方案,以滿足任何旁觀者的好奇心。這第一個可能就是我會考慮「慣用的」數學:
map1[f_, {}] := {}
map1[f_, {e_, rest___}] := {f[e], [email protected]@map1[f,{rest}]}
這裏是沒有利用模式匹配相當多,這基本上是什麼OP結束了與方法:
map2[f_, {}] := {}
map2[f_, lis_] := {f[First[lis]], [email protected]@map2[f, Rest[lis]]}
該{f[e], [email protected]@map[f,{rest}]}
部分可以以各種等效方式來表達,例如:
Prepend[map[f, {rest}], f[e]]
Join[{f[e]}, map[f, {rest}]
(@Mike使用此方法)
Flatten[{{f[e]}, map[f, {rest}]}, 1]
我要把它留給讀者去思考的更多,並思考的多數那些=對性能的影響)
最後,爲了好玩,這裏是一個程序版本,儘管寫它讓我有點噁心:;-)
map3[f_, lis_] :=
(* copy lis since it is read-only *)
Module[{ret = lis, i},
For[i = 1, i <= Length[lis], i++,
ret[[i]] = f[lis[[i]]]
];
ret
]
你是什麼意思「這個函數是什麼樣的」?我假設你在問'Map';你看過[文檔](http://reference.wolfram.com/mathematica/ref/Map.html)嗎?那裏有什麼讓你感到困惑嗎? – Cascabel 2010-11-08 18:43:13
我不確定你在找什麼。你在尋找'Map'(參數佈局)的簽名,它是如何運作的,或者它是如何實現的? – rcollyer 2010-11-08 18:45:17
我正在尋找它是如何運作的,如何在mathematica中遞歸地移動一個列表,特別是Map中的第一個參數是什麼,如果我自己寫的是我自己所知的如何實現Map(__,List)放在第一支架? – Mike 2010-11-08 18:51:10