1

L2の長さがL1の長さよりも大きいと仮定して、最初のリスト(L1)が2番目のリスト(L2)にある場合にtrueを返すMathematicaのモジュールを作りたい。私はこのようにそれをしました、問題は常に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

これは、利用可能な最もクリーンで最速の一般的な方法の1つである可能性があります。

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

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

Realすべてまたは値のリストについては、ここに示す方法を最大速度にInteger適合させることができます。


ユーザーの書き込み:

おかげで、それは良い方法ですが、私が欲しいのは、新しいコードがないようにコードを修正することです。これは学校の演習であり、ステートメントではForループを使用する必要があると言われています。

の構文Break[]と関数に混乱があるようですReturn。コードを修正するために、&で置き換えBreakました。Break[]ReturnThrowCatch

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 に答える