2017-01-10 10 views
2

Я пытаюсь решить некоторые проблемы с моей домашней работы в Прологе: суммы кратных:Пролог суммы кратных (рекурсия)

, например:

multi_sum([[2,3],[5,4],[3,1,2]],X). 

должен вернуться: X = 32. но я получаю в результате: false.

multi([],1). 
multi([A|B]|G):-multi(B,Z),G is A * Z. 

multi_sum([],0). 
multi_sum([A|B],Q):- multi(A,M) , multi_sum(B,T), Q is T + M. 
+1

@Boris: Я думаю, что он сделал опечатку: обратите внимание на трубы ('|') вместо запятой ('') в голове второй линии. –

+0

@WillemVanOnsem Да, это опечатка. –

+0

'multi ([2], R)' уже не удается. – false

ответ

1

Вам нужно разделить задачу на две части:

  • часть, которая вычисляет произведение списка чисел как ваш multi/2; и
  • часть, которая рассчитывает сумму по этим продуктам, как multi_sum/2.

Для вашего multi/2, вы сделали опечатку:

 
multi([A|B]|G):-multi(B,Z),G is A * Z. 

Вторая труба (|) должна быть запятая (,):

 
multi([A|B],G):-multi(B,Z),G is A * Z. 

Сейчас он работает:

?- multi_sum([[2,3],[5,4],[3,1,2]],X). 
X = 32. 

Тем не менее, вы можете повысить эффективность за счет использования аккумуляторов и хвостовую рекурсию:

multi(L,R) :- 
    multi(L,1,R). 

multi([],R,R). 
multi([A|B],S,R) :- 
    T is S*A, 
    multi(B,T,R). 

multi_sum(L,R) :- 
    multi_sum(L,0,R). 

multi_sum([],R,R). 
multi_sum([A|B],S,R) 
    multi(A,Sub), 
    T is S+Sub, 
    multi_sum(B,T,R). 
+0

отличный ответ спасибо!. –

+0

Не уверен в заявке на эффективность. Это произойдет в постоянной памяти с оптимизацией хвостовой рекурсии, но я не уверен, что это будет быстрее (во многих случаях рекурсия аккумулятора + хвост на самом деле медленнее!) –

 Смежные вопросы

  • Нет связанных вопросов^_^