Я совершенно новый для пролога, и я чувствую, что есть концепция, которую я не понимаю, что мешает мне понять концепцию рекурсии в прологе. Я пытаюсь вернуть S
, что является суммой квадрата каждой цифры, взятой в виде списка из целого числа, введенного пользователем в запросе. Например, пользователь вводит 12345
, я должен вернуть S = (1^2)+(2^2)+(3^2)+(4^2)+(5^2) = 55
.Prolog - Результат печати после двух рекурсивных правил | Sum of Squares
В моей программе ниже я понимаю, почему каждый сегмент вычисления S печатается многократно, поскольку он является частью рекурсивного правила. Однако я не понимаю, как я смогу напечатать S в качестве конечного результата. Я решил, что я могу установить переменную = на результат из sos во втором правиле и добавить его как параметр для intToList, но не могу представить, как это сделать. Компилятор предупреждает, что S является одноэлементной переменной в правиле intToList.
sos([],0).
sos([H|T],S) :-
sos(T, S1),
S is (S1 + (H * H)),
write('S is: '),write(S),nl.
intToList(0,[]).
intToList(N,[H|T]) :-
N1 is floor(N/10),
H is N mod 10,
intToList(N1,T),
sos([H|T],S).
Возможно, вы можете использовать 'maplist' для преобразования списка цифр в список цифр:' maplist (atom_number, Digit_Chars, Digits) ', что устраняет необходимость в' int_to_list1/2'. Это хороший стандартный предикат для обработки/сопоставления списков для каждого элемента. – lurker
Спасибо, очень полезно объяснение. – hailnick