Дан список. Убедиться, что сумма эл-ов (чисел), стоящих на четных местах,равна сумме эл-ов,стоящих на нечетных - Prolog
Формулировка задачи:
Сабж в шапке, очень нужна помощь. В решении необходимо использовать рекурсию хвоста списка.
Решение задачи: «Дан список. Убедиться, что сумма эл-ов (чисел), стоящих на четных местах,равна сумме эл-ов,стоящих на нечетных»
textual
Листинг программы
domains int=integer intl=int* predicates sum_evp_odp(intl,int,int,int) task(intl) clauses sum_evp_odp([],0,0,_). sum_evp_odp([H|T],E,O,N) :- N1=N+1, (N mod 2)=0, sum_evp_odp(T,E1,O,N1), E=E1+H. sum_evp_odp([H|T],E,O,N) :- N1=N+1, (N mod 2)<>0, sum_evp_odp(T,E,O1,N1), O=O1+H. task(X) :- sum_evp_odp(X,E,O,0), O=E. task(X) :- sum_evp_odp(X,E,O,0), O<>E, fail.
Объяснение кода листинга программы
Код решает задачу на подсчёт суммы элементов списка, стоящих на четных и нечетных позициях. В этом коде:
- Создаются четыре предиката: sum_evp_odp, sum_evp_odp, sum_evp_odp, sum_evp_odp
- Создается функция task, которая вызывает sum_evp_odp для списка и проверяет результат.
- В функции sum_evp_odp рекурсивно вызывается функция sum_evp_odp для списка, начиная с первого элемента.
- Если список пустой, то рекурсия заканчивается и возвращается ноль.
- Если элемент списка нечетной позиции (N mod 2) не равен нулю, то рекурсия продолжается для списка, начиная с элемента, следующего за текущим.
- Если элемент списка четной позиции (N mod 2) равен нулю, то рекурсия продолжается для списка, начиная с элемента, следующего за текущим.
- Функция task вызывает sum_evp_odp для списка и проверяет результат.
- Если сумма элементов списка, стоящих на четных позициях, равна сумме элементов, стоящих на нечетных позициях, то возвращается ноль.
- Если сумма элементов списка, стоящих на четных позициях, не равна сумме элементов, стоящих на нечетных позициях, то возвращается значение, отличное от нуля.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д