С учетом [1,2,3] в прологе получим обратно [6,5,3] путем обратного накопления - PullRequest
0 голосов
/ 18 ноября 2009

Q. Учитывая [1,2,3] в Прологе получить обратно [6,5,3] путем обратного накопления

У меня есть стартовый код:

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

....

Я ищу базовое решение для Пролога.

Ответы [ 4 ]

3 голосов
/ 18 ноября 2009

Мы здесь не для того, чтобы делать домашнюю работу для вас. Поэтому лучшее, что мы можем сделать, это дать вам несколько советов. Поэтому задайте себе эти вопросы:

  1. Каковы базовые случаи здесь (для каких входов выход является немедленным)?
    • У вас есть accumulate([N], [N])., а как насчет пустых списков?
  2. В каком порядке должны выполняться дополнения?
  3. В частности, какие элементы должны быть добавлены первыми?

Кроме этого, я могу вам сказать, что вы можете решить это, используя три пункта. Никаких других предикатов не требуется. Удачи!

Бонус : вы можете определить заголовок рекурсивного предложения следующим образом:

accumulate([N|T], [N1,N2|T2]).
1 голос
/ 25 декабря 2009

Вот мой дубль:

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, если вы предпочитаете это.

0 голосов
/ 12 февраля 2012
    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].
0 голосов
/ 29 ноября 2009

Когда вы закончите базовую реализацию, попробуйте решить эту проблему за O (n) раз. Идея состоит в том, чтобы начать с первого элемента и продолжать добавлять его во вторичный список, пока ваш первоначальный список не станет пустым. Вторичный список - это обратный список, который вам нужен.

Если вы добавите два списка на своем рекурсивном шаге, у вас будет сложность O (N ^ 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...