5

可変長のリストを順番に 3 つの偶数のリストに分割する関数を作成しようとしています。以下はそれを 3 つに分割しますが、プロセスはそれらを一度に 1 つずつ各リストに挿入します。

私が欲しいものの例は次のとおりです。

[1, 2, 3, 4, 5] -> [1, 2], [3, 4], [5]

別の例は次のとおりです。

[8, 7, 6, 5, 4, 3, 2, 1] -> [8, 7, 6], [5, 4, 3], [2, 1].

次のコードは、一度に 1 つずつ各リストに挿入して分割します。

div([], [], [], []).
div([X], [X], [], []).
div([X,Y], [X], [Y], []).
div([X,Y,Z|End], [X|XEnd], [Y|YEnd], [Z|ZEnd]):-
  div(End, XEnd, YEnd, ZEnd).

このコードは次を出力します。

[1, 2, 3, 4, 5] -> [1, 4], [2, 5], [3]

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

2
div(L, L1, L2, L3) :-
    append(L1, L1_suffix, L),
    append(L2, L3, L1_suffix).

これで 3 つのリストがどのように分かれているかわかりましたか? L1ここで、リスト、L2、およびが期待される長さについては言いませんL3。現在のように述語を一般的なものにしたくない場合は、 を使用して 3 つの結果の長length/2さを取得し、長さを設定できます。L

あなたは「比較的均等な長さ」と言っていますが、これは相対的であり、どういうわけか解釈する必要があります。正の整数lenとn、len = 3nの場合、kの場合、len1 = len2 = len3 = nを取得することを意味すると仮定しましょう= 3n+1 の場合、len1 = n+1、len2 = len3 = n となり、k = 3n+2 の場合、len1 = len2 = n+1、len3 = n となります。長さを計算する方法を理解させます。

div(L, L1, L2, L3) :-
    length(L, Len),
    % here you compute for example Len1 and Len2
    length(L1, Len1),
    length(L2, Len2),
    append(L1, L1_suffix, L),
    append(L2, L3, L1_suffix).
于 2014-11-21T09:20:12.217 に答える