2016-03-20 5 views
0

再帰追加:1つのメンバが毎回1メンバ減少し、マージしたい整数のリストがたくさん返されます再帰追加:1つのリストが毎回1メンバずつ減少し、マージする整数のリストが多数返されます

[0,0,0,5,5,5,3,3,3,2,4,4]

So far I get the subsolutions : 
[4,4] 

**But I can not concatenate the rest of the solutions** 
[2] 
[3,3,3] 
[5,5,5] 
[0,0,0] 

しかし、この1つは

を動作しません:私はこの結果を探し

/* Merge the subsolutions recursive. THIS IS THE ONE THAT DOES NOT WORK */ 
mergeB(S,[],[A]) :- block(S,A). 
mergeB(S,X,[L|Tail],[Tail|A]) :- block(S,A), quitaUltimo(S,M), mergeB(M,X,Tail). 
+1

私はそれが私のものかどうかわかりませんが、私はあなたが何をしようとしているのか分かりません。おそらく、[(3,5)、(6,3)、(9,2)、(10,4)、(12,0)]から[0,0,0、 5,5,5,3,3,3,2,4,4]。 – SND

+0

これは非常に不明です。私はここでも具体的な質問はしていない。あなたは声明を出しています*これまでのところ、[4,4]、[2]、[3,3,3]、[5,5,5]、[0,0,0] '*しかし、あなたがそれを得るためにどのようなクエリを実行したのか、あるいはそれがどのような質問に関連しているのかを全く示さない。 – lurker

+0

私はその質問を示します。 %ブロック([(3,5)、(6,3)、(9,2)、(10,4)、(12,0)]、L2)。 %L2 = [4,4] – alvarellos

答えて

0

さて、あなたは何を達成しようとしているのかまだ分かりませんが、あなたが言ったビットとピースから取りました:

"アイデアは次のとおりです:座標リストから:L = [...]私はこの結果を探します:[0,0,0,5,5,3,3,3,2,4,4] これまでのところ、私は次のようなサブソリューションを得ました:[4,4]、2、[3 、3,3]、[5,5,5]、[0,0,0]である。 ...私はこのすべてのソリューションをマージしたい。」

そして、それはあなたが再帰的にので、すべての個別の結果は1つの結果のリストに終了しますサブリストのすべてを追加しようとしているようだ。

、この場合は、何がしたいことは実際には非常に単純flatten正しいと呼ばれている

入力データと出力例:。

?- flatten([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],Result). 
    Result = [4, 4, 2, 3, 3, 3, 5, 5, 5, 0, 0, 0] 

注:あなたのデータはあなたが達成しようとしているものと逆の順序で表示されています。あなたのコードを帰納的に再帰的に修正することができない場合は、後でreverseでそれを行うことができます。

だから、すべてがまとめ:

?- reverse([[4,4],[2],[3,3,3],[5,5,5],[0,0,0]],R), flatten(R,RFlat). 
    R = [[0, 0, 0], [5, 5, 5], [3, 3, 3], [2], [4, 4]], 
    RFlat = [0, 0, 0, 5, 5, 5, 3, 3, 3, 2, 4, 4] 

EDIT

いくつかの考え:

私はあなたがそれらを処理するために、リストの最後の2つの要素を取得している参照して、再帰的にしたいです同じリストに対してこれをやってください。最後の要素だけが削除されています。あなたはここで逆リストのアプローチのために行くこともできますが、行くための別の方法は、のようになります。最後に、ブロックのロジックを実行するために

% Base case (*) 
foo([_],[]). 

% Recursively calls block on last 2 elements of list and removes last elem 
foo(List,[SubResult|R]) :- 
    last2_and_rest(List,X,Y,Rest), 
    block(X,Y,SubResult), 
    foo(Rest,R). 

:あなたのような何かを書くことができ、この方法で

% Gets last two elements and returns the list with last one removed 
last2_and_rest([X,Y],X,Y,[X]). 
last2_and_rest([H|T],X,Y,[H|A]) :- last2_and_rest(T,X,Y,A). 

2つの要素は、最後の要素が削除された状態で同じリストのままであり、残りのリストの要素の各ペアについて再帰的にそれを続けます。リストに要素がもう1つだけ残っていると、last2_and_restを呼び出すことができなくなります。これはfalseを返すので、それに応じてベースケース(*)を記述します。

私はまだあなたが実行しようとしているロジックを理解していないので、このコードでは/ before/after/..ブロック/ 2の呼び出しで何が起こるか考慮していませんが、その部分は機能しており、あなたは副作用の併合に問題があるだけだと述べました。

このコードが実行され、ロジックを正しく追加すると、[[0,0,0]、[5,5,5]、[3,3,3]、...のような結果が得られます。 。]あなたは私が上で説明したようにその後、平らにすることができます。

+0

ありがとうございます。しかし、私はどのようにサブソリューションをマージしますか?それが私の主な問題です。それが役に立ったら、コード全体を書いた。 – alvarellos

+0

ありがとうございました。私はPrologの初心者です。私はこれをやろうと夢中になっていました。他のものはシンプルですが、とても基本的なものはとても複雑かもしれないとは信じられませんでした。それにも迅速にお答えいただき、ありがとうございます。 – alvarellos

+0

あなたは大歓迎です! – SND

関連する問題