Неотрицательная степень целого числа

      Комментарии к записи Неотрицательная степень целого числа отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Общие вопросы Неотрицательная степень целого числа

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

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

    questioner
    Участник

    Создайте предикат, вычисляющий неотрицательную степень целого числа.

    Нашла решение, но не могу его понять, помогите разобраться.

    predicates
      степень(integer Основание, integer Показ, integer Результат)
    clauses
      степень(0, B, 0):- B > 0, !.
      степень(A, 0, 1):- A <> 0, !.
      степень(A, B, Pow):- A > 0, B > 0, !, 
        Pow = val(integer, exp(B * ln(A))).
      степень(A, B, Pow):- A<>0, B > 0, B mod 2 = 0, !, 
        Pow = val(integer, exp(B * ln(abs(A)))).
      степень(A, B, Pow):- A<>O, B > 0,  
        Pow = - val(integer, exp(B * ln(abs(A)))).
    goal
        степень(-2, 5, Степень).

  • #1827

    В вашем решении используются свойства логарифмов, а именно:
    a * log(b) = log(b^a)
    Это быстро и эффективно, особенно для дробных степеней.
    Не для всех чисел может быть вычислен логарифм, поэтому в начале ваша функция выполняет соответствующие проверки.
    Логарифм нельзя вычислить для отрицательного числа, поэтому если число, возводимое в степень меньше нуля — то вычисляется (-a) * log(-b).

    Более понятное, но менее эффективное решение:

    predicates
        pow(integer, integer, integer) % Nummer, Degree, Number^Degree
    clauses
        pow(Number, Degree, Result):-
            Degree < 0, !, fail;
            Degree = 0, !, Result = 1;
            NextDegree = Degree - 1, pow(Number, NextDegree, NextResult), 
            Result = NextResult * Number.

    Тут используется тот факт, что Number^Degree = Number * Number^(Degree-1) для целых положительных степеней.
    Функция проверяет корректность исходных данных и, если они не корректны — завершается неудачей.
    Если требуется возвести в нулевую степень — функция возвращает единицу.
    Во всех остальных случаях вычисляет результат рекурсивно.

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