我想在Mathematica中创建一个模块,如果第一个列表(L1)在第二个列表(L2)中,假设L2的长度大于L1的长度,则返回true。 我是这样做的,问题是总是返回False,我不知道为什么。 编辑:我已经解决了一个问题:我写了“if”而不是“If”。现在我得到一个无限循环。
isSegment[L1_List, L2_List] := Module[{i, j}, For[i = 1, i + Length[L1] - 1 <= Length[L2],
For[j = 1, j <= Length[L1],
If[L2[[i + j - 1]] != L1[[j]], Break;];
j++;
];
If[j == Length[L1] + 1,
Return[ True];];
i++; ]; Return [False]; ]
答案 0 :(得分:4)
这可能是最干净,最快的一般方法之一:
isSegment[{L1__}, L2_List] := MatchQ[L2, {___, L1, ___}]
isSegment[{3, 4, 5}, Range@10]
True
要获取所有Real
或Integer
值的列表,您可以调整here显示的方法以获得最大速度。
用户写道:
谢谢,这是一个好方法,但我想要的是纠正我的代码而不是新代码,因为它是学校的练习,并且在声明中我们必须使用For循环。
Break[]
的语法和Return
的功能似乎存在混淆。为了更正代码,我将Break
替换为Break[]
,将Return
替换为Throw
&amp; Catch
。
isSegment[L1_List, L2_List] :=
Catch @ Module[{i, j},
For[i = 1, i + Length[L1] - 1 <= Length[L2],
For[j = 1, j <= Length[L1],
If[L2[[i + j - 1]] != L1[[j]], Break[];]; j++;];
If[j == Length[L1] + 1, Throw[True];];
i++;]; Throw[False];
]
答案 1 :(得分:1)
我通常会使用以下内容解决此问题:
SegmentQ[l1_List, l2_List] := MemberQ[Partition[l2, Length @ l1, 1], l1]