Сумма факториалов

      Комментарии к записи Сумма факториалов отключены

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 2 мес. назад.

  • Автор
    Сообщения
  • #1816

    questioner
    Участник

    Добрый день, не могли помочь с решением задачи на Prolog?
    Вычислить сумму, приведенную на картинке:
    sum of factorials

    Встроенную функцию для факториала нельзя использовать, так же еще в условии сказано что можно использовать 2 накопителя в первом хранится текущий факториал, во втором сумма.

    summa(N,K):-
      sum(N, K,0,0,1).
    sum(N,K,S,F,I):-
      K=<n,
      F is k*i, I1 is I+1,
      S1 is F+F*K1,
      sum(N, K1, S1, I1).
    summa(?).

  • #1818

    sum(N, K, S):-
        sum(1, N, K, 1, 0, S).
    sum(I, N, K, F, S, R):-
        I > K, !, R = S;
        II is I + 1, FF is F * I, (
            I < N, !, sum(II, N, K, FF, S, R);
            SS is S + F, sum(II, N, K, FF, SS, R)
        ).

    Первый предикат можно убрать, но я бы поместил в него проверку корректности исходных данных. N должно быть меньше K, оба числа должны быть натуральными числами.
    Второй предикат принимает 2 накопителя (для факториала и суммы) и счетчик элементов (I).
    В четвертой строке выполняется проверка того, что все элементы обработаны, в этом случае предикат возвращает накопленную сумму в качестве результата.
    Если не все элементы обработаны, то надо вычислить значение счетчика на следующей итерации и соответствующее ему значение факториала, это выполняется в пятой строке.
    Если I < N, то нужно вычислять значение факториала, но не требуется прибавлять результат к сумме, поэтому такой случай обрабатывается отдельно в шестой строке. В противном случае, значение суммы должно измениться, оно вычисляется в переменной SS и передается в качестве нового значения накопителя рекурсивно.Я очень рекомендую прочитать статьи на блоге. Я очень подробно и на сотнях примеров поясняю принципы программирования на прологе. Я проверил, что пролог — это весьма удобный язык для весьма широкого класса задач. Зачастую более удобный чем С++, а кроме того, пролог значительно проще. Просто дают его на последних курсах, когда мозги у студентов уже окаменели…

Для ответа в этой теме необходимо авторизоваться.