• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Сумма Ряда

  • Автор темы Guest
  • Дата начала
G

Guest

Помогите пожалуйста. Никак не могу сделать.
Реализовать с помощью итеративного и рекурсивного алгоритмов на Prolog:
e.jpg

Пока сумел сделать чтоб оно считало следующее:
s=sin1+sin2+...+sinN
А вот как с дробью?? Кто поможет?

Код:

predicates
summa(unsigned, real)

clauses
summa(1, 0.841) :- !.
summa(N, S) :-
Y = N-1,
summa (Y, P_summa),
S = sin(N)+P_summa.

goal
N=2,
summa (N,S).
 
R

rrrFer

Код:
predicates
p( integer, integer, real, real )
goal
p( 5, 0, 0, S ), write(S).
clauses
p( N, N, _, 0 ).
p( N, M, S, R ):-
M + 1 = MM,
TS = S + sin( MM ),
p( N, MM, TS, RR ),
R = RR + 1 / TS.
не проверял
 
G

Guest

Программа считает правильно. Тестировал при N=5. Ответ верный.
Но всегда выдает ошибку переполнения стека:

PROGRAM ERROR. Module:OBJ\GOAL$000.PRO Pos:179
Message:1010 Stack overflow

Как от нее избавиться?
 
R

rrrFer

у меня не выдает. Проверял на Turbo Prolog, а у вас диалект не указан.
 
R

rrrFer

проверил в VIP, ошибок не выдает, выдает предупреждения, но это не страшно. Так и предупреждений не выдает:
Код:
predicates
nondeterm p( integer, integer, real, real )
goal
p( 5, 0, 0.0, S ), write(S), readint(_).
clauses
p( N, N, _, 0.0 ).
p( N, M, S, R ):-
M + 1 = MM,
TS = S + sin( MM ),
p( N, MM, TS, RR ),
R = RR + 1 / TS.
 
G

Guest

r04, спасибо за помощь. Только вот вопрос: а какой алгоритм это получается, рекурсивный или итеративный?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!