如何创建列表函数,如果列表中的任何成员为负数,则为零,否则它遵循递归关系。
数学上这是我必须要做的,但我不知道如何在Mathematica中做到这一点。
感谢。
编辑:为了完全准确,我试图在本文的第6页(方程式18)实现递归关系: http://arxiv.org/PS_cache/nlin/pdf/0003/0003069v1.pdf
然而,它非常复杂,需要相当多的阅读才能理解,所以我不想把它带入问题!
答案 0 :(得分:3)
测试列表的任何成员是否满足某些条件可以使用MemberQ来完成。要测试列表lst
是否包含任何小于零的元素,
lst = {1, 2, 0, -4};
MemberQ[lst, x_ /; x < 0]
这里的第二个参数是conditional pattern。
但是,知道你想做什么会有所帮助。
答案 1 :(得分:3)
这是另一种方法:
g[l_List /; Min[g] >= 0] := (* recursion relation *)
g[l_List] := 0
答案 2 :(得分:2)
您可以使用条件测试定义函数,以便如果所有元素都是非负数,则使用递归关系。
f[l_List] /; And @@ NonNegative[l] := (* recursion relation *)
然后,更一般的情况仅适用于并非所有元素都是非负的,即有些是负数或零。
f[l_List] := 0
使用模式匹配的更简单的方法
fff[l:{__?NonNegative}]:= (* recursion relation *)
fff[l_List]:= 0
修改强>
事实证明,我首先提出的方法效率最高。
ff[l_list] /; And @@ NonNegative[l] := True
ff[l_List] := 0
Brett的版本
gg[l_List] /; Min[l] > 0 := True
gg[l_List] := False
我的第二个提案
hh[l : {__?NonNegative}] := True
hh[l_List] := False
我的第二个提案的一个变体,专注于找到否定词,而不是找不到它们,如果这有意义的话。
jj[l : {___, _?Negative, ___}] := False
jj[l_List] := True
在这种情况下应该只有一些否定
testfg = RandomInteger[{-1, 1000}, 10000];
一个有很多底片的案例:一些模式匹配器不需要扫描整个列表
testfg1 = RandomInteger[{-1, 4}, 10000];
这个应该返回True
testfg2 = RandomInteger[{0, 4}, 10000];
现在测试:
ff[testfg] // Timing
{0.000016, 0}
ff[testfg1] // Timing
{0.000015, 0}
ff[testfg2] // Timing
{0.000024, 0}
Brett的版本稍慢,但总体上排名第二
gg[testfg] // Timing
{0.000049, True}
gg[testfg1] // Timing
{0.000049, True}
gg[testfg2] // Timing
{0.00005, True}
hh[testfg] // Timing
{0.000271, False}
hh[testfg1] // Timing
{0.000234, False}
hh[testfg2] // Timing
{0.003809, True}
jj[testfg] // Timing
{0.002482, False}
果然,如果有很多负数,这个版本很快,而且不需要检查整个列表。
jj[testfg1] // Timing
{0.0005, False}
但如果由于模式的扩张性而没有负数,则效率非常低
jj[testfg2] // Timing
{0.678945, True}