добавление в список чисел, которые меньше заданного числа - PullRequest
0 голосов
/ 24 апреля 2018

Я изучаю пролог, и мне нужно создать программу, которая возвращает сложение чисел (в списке), которые меньше заданного числа. У меня есть это ..

additionsmaller([X|XS],K,R):-X>K, additionsmaller(XS,K,R).
additionsmaller([X|XS],K,R):-X<K, additionsmaller(XS,K,T), R is T + X.
additionsmaller([X],K,X):-X<K.
additionsmaller([X],K,0):-K<X.

Я ожидаю, например:

additionsmaller([1,2,3,4,2],4,R).
R=8

Но это дает мне ложь.

Я использую это https://swish.swi -prolog.org

Что я могу сделать, чтобы это исправить? что не так с моим кодом?

1 Ответ

0 голосов
/ 25 апреля 2018

Проблема заключается в том, что для значения V вы обрабатываете только случаи X<V и X>V, а не случай X=V.Фактически, если вы замените X>K на X>=K, ваша программа выдаст результат R=8.

Позвольте мне сказать о вашей программе две вещи:

Прежде всего, выне нужны последние две строки в вашем коде (т.е. additionsmaller([X],K,X):-X<K. и additionsmaller([X],K,0):-K<X.).Просто замените эти две строки на additionsmaller([],_,0).

Второе: вам также следует написать хвостовое рекурсивное решение, например:

additionSmallerTail([],_,V,V).
additionSmallerTail([H|T],K,V,V0):-
    H >= K,
    additionSmallerTail(T,K,V,V0).
additionSmallerTail([H|T],K,V,V0):-
    H < K,
    V1 is V+H, 
    additionSmallerTail(T,K,V1,V0).

?- additionSmallerTail([1,2,3,4,2],4,0,R).
R = 8
false

Зачем использовать хвостовую рекурсию? Эта ссылка интересна.

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