1

我想在 Mathematica 中创建一个模块,如果第一个列表 (L1) 在第二个列表 (L2) 中,则返回 true,假设 L2 的长度大于 L1 的长度。我是这样做的,问题是总是返回 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];   ]
4

2 回答 2

4

这可能是可用的最干净和最快的通用方法之一:

isSegment[{L1__}, L2_List] := MatchQ[L2, {___, L1, ___}]

isSegment[{3, 4, 5}, Range@10]
True

对于所有RealInteger值的列表,您可以调整此处显示的方法以获得最大速度。


用户写道:

谢谢,这是一个好方法,但我想要更正我的代码不要有新的,因为这是学校的练习,并且在声明中说我们必须使用 For 循环。

似乎对 的语法Break[]和功能存在混淆Return。为了更正我BreakBreak[]&Return替换的代码ThrowCatch

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];
   ]
于 2012-10-18T07:00:02.350 回答
1

我通常会使用这样的东西来解决这个问题:

SegmentQ[l1_List, l2_List] := MemberQ[Partition[l2, Length @ l1, 1], l1]
于 2012-10-17T23:24:55.257 回答