0

Q. Prolog で [1,2,3] が与えられた場合、逆累積により [6,5,3] が返されます

私は開始コードを持っています:

accumalate([H],[H]).
accumalate([H1 | H2], [Hnew, H2]),
       Hnew is H1 + H2.

....

基本的な Prolog ソリューションを探しています。

4

4 に答える 4

3

私たちはあなたのために宿題をするためにここにいるのではありません。そのため、私たちができる最善のことは、いくつかのヒントを提供することです。したがって、次の質問を自問してください。

  1. ここでの基本ケースは何ですか (入力が即時出力である場合)?
    • がありますがaccumulate([N], [N]).、空のリストはどうですか?
  2. 追加はどのような順序で実行する必要がありますか?
  3. より具体的には、どの要素を最初に追加する必要がありますか?

それ以外は、3 つの句を使用してこれを解決できると言えます。他の述語は必要ありません。幸運を!

おまけ: 再帰節の先頭を次のように定義することもできます。

accumulate([N|T], [N1,N2|T2]).
于 2009-11-17T22:51:58.773 に答える
1

これが私の見解です:

accumulate([],[]).
accumulate([H|T], [H1|T1]):-
    sum([H|T],H1),
    accumulate(T,T1).
sum([],0).
sum([H|T],Y):-
    sum(T,Y1),
    Y is H + Y1.

sumlist/2もちろん、必要に応じて、手作りの代わりにビルトインを使用することもできsum/2ます。

于 2009-12-24T23:51:42.033 に答える
0
    ac([], 0, []).

    ac([H|T], ST, [ST|Res]) :-
        ac(T, X, Res),
        ST is H + X.

    accum(List, Res) :-
        ac(List, _, Res).

[trace]  ?- accum([1,2,3], X).
   Call: (6) accum([1, 2, 3], _G376) ? creep
   Call: (7) ac([1, 2, 3], _G458, _G376) ? creep
   Call: (8) ac([2, 3], _G461, _G454) ? creep
   Call: (9) ac([3], _G464, _G457) ? creep
   Call: (10) ac([], _G467, _G460) ? creep
   Exit: (10) ac([], 0, []) ? creep
   Call: (10) _G459 is 3+0 ? creep
   Exit: (10) 3 is 3+0 ? creep
   Exit: (9) ac([3], 3, [3]) ? creep
   Call: (9) _G456 is 2+3 ? creep
   Exit: (9) 5 is 2+3 ? creep
   Exit: (8) ac([2, 3], 5, [5, 3]) ? creep
   Call: (8) _G453 is 1+5 ? creep
   Exit: (8) 6 is 1+5 ? creep
   Exit: (7) ac([1, 2, 3], 6, [6, 5, 3]) ? creep
   Exit: (6) accum([1, 2, 3], [6, 5, 3]) ? creep
X = [6, 5, 3].
于 2012-02-11T21:39:57.487 に答える
0

基本的な実装が完了したら、この問題を O(n) 時間で解いてみてください。アイデアは、最初の要素から始めて、元のリストが空になるまで二次リストに追加し続けることです。二次リストは、必要な逆リストです。

再帰的なステップで 2 つのリストを追加すると、O(N^2) の複雑さになります。

于 2009-11-29T09:25:30.960 に答える