3

私はプロローグでリストのk長のサブセットを見つける必要があります.私はこの関数を持っています:

    subset([], []).
    subset([E|Tail], [E|NTail]):-
    subset(Tail, NTail).
    subset([_|Tail], NTail):-
    subset(Tail, NTail).

リストの長さについて別のルールを適用し、

    length(Xs,Size)

問題は、すべての長さのサブセットを検索するために非常に遅いことです.このk長のサブセットの直接再帰的な定義はありますか?

1週間探したけど何も見つからない

4

1 に答える 1

3

に対する最初の解を使用してsubset/2、別の引数 (Len) を追加し、次のことを行うことができます。

  • Len = 0 の場合、基本ケースが成立します。
  • 新しい Len=0 の場合、要素を追加して Len をデクリメントし、再帰を終了する再帰ステップ

それは次のようになります。

 subset(0, [], []).
 subset(Len, [E|Tail], [E|NTail]):-
   succ(PLen, Len),
   (PLen > 0 -> subset(PLen, Tail, NTail) ; NTail=[]).
 subset(Len, [_|Tail], NTail):-
   subset(Len, Tail, NTail).
于 2013-04-05T15:03:31.997 に答える