Q.鑑於[1,2,3]在Prolog中取回[6,5,3]通過逆積累鑑於[1,2,3]在序言取回[6,5,3]通過逆accumalation
我有開始代碼:
accumalate([H],[H]).
accumalate([H1 | H2], [Hnew, H2]),
Hnew is H1 + H2.
....
我要找基本Prolog的解決方案。
Q.鑑於[1,2,3]在Prolog中取回[6,5,3]通過逆積累鑑於[1,2,3]在序言取回[6,5,3]通過逆accumalation
我有開始代碼:
accumalate([H],[H]).
accumalate([H1 | H2], [Hnew, H2]),
Hnew is H1 + H2.
....
我要找基本Prolog的解決方案。
我們不是在這裏爲你做你的功課。所以我們能做的最好的就是提供一些提示。所以問自己這些問題:
accumulate([N], [N]).
,但對於空列表?除此之外,我可以告訴你,你可以用三個子句解決這個問題。不需要其他謂詞。祝你好運!
獎金:你可能要定義的遞歸條款的頭如下:
accumulate([N|T], [N1,N2|T2]).
一旦你完成了基本實現完成後,嘗試爲O解決這個問題(n)的時間。這個想法是從第一個元素開始,並繼續添加到第二個列表,直到您的原始列表爲空。輔助列表是您需要的反向列表。
如果附加在你的遞歸步驟的兩個列表,你會最終有一個O(N^2)複雜性。
這是我的看法:
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
如果你喜歡的。
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].
這是功課?如果是這樣,請標記爲。 – Stephan202 2009-11-17 22:41:02
此外,適當的詞是「積累」。你能告訴我們你到目前爲止所嘗試過的嗎?具體來說,你不明白? – Stephan202 2009-11-17 22:44:51
沒有不作業,只是學習筆記,它是我被卡住的一個例子,更多的修訂。 – Dan 2009-11-17 22:47:29