原始问题:
我知道Mathematica有一个内置的地图(f,x),但这个功能是什么样的?我知道你需要查看列表中的每个元素.
任何帮助或建议?
编辑(由Jefromi,Mike的评论拼凑而成):
我正在开发一个程序,需要通过像Map这样的列表,但是我不允许使用它.我也不允许使用Table; 我需要在没有其他功能帮助的情况下浏览列表.我正在处理一个递归版本,我有一个空列表,但是在列表中包含其中的项目并没有成功.这是我的第一种情况:( newMap[#, {}] = {}
空列表的地图只是一个空列表)
我发布了一个递归解决方案,但后来又决定删除它,因为从评论中这听起来像是一个家庭作业问题,而且我通常是一个教导鱼人.
您正在使用定义的递归解决方案newMap[f_, {}] := {}
.
Mathematica的模式匹配是你的朋友.考虑如何实现的定义newMap[f_, {e_}]
,并从那里newMap[f_, {e_, rest___}]
.
最后一个提示:一旦你可以定义最后一个函数,你实际上并不需要这个案例{e_}
.
更新:
根据您的评论,这个例子可能会帮助您了解如何应用任意函数:
func[a_, b_] := a[b]
In[4]:= func[Abs, x]
Out[4]= Abs[x]
Run Code Online (Sandbox Code Playgroud)
解
由于OP捕获了一条鱼,可以这么说,(恭喜!)这里有两个递归解决方案,以满足任何旁观者的好奇心.第一个可能是我认为"惯用"的Mathematica:
map1[f_, {}] := {}
map1[f_, {e_, rest___}] := {f[e], Sequence@@map1[f,{rest}]}
Run Code Online (Sandbox Code Playgroud)
这种方法不能充分利用模式匹配,这基本上是OP最终的结果:
map2[f_, {}] := {}
map2[f_, lis_] := {f[First[lis]], Sequence@@map2[f, Rest[lis]]}
Run Code Online (Sandbox Code Playgroud)
该{f[e], Sequence@@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
]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1005 次 |
最近记录: |