Некорректные аргументы функции принимаемой в качестве параметра - Lisp

Узнай цену своей работы

Формулировка задачи:

Допустим есть функция для определения предела последовательности.
(defun lim (fn e)
   (do ((i 1 (+ i 1)))
      ((or (< (abs (- (funcall fn i)
                      (funcall fn (+ 1 i))))
              e)
       (< 100000 (funcall fn (+ 1 i))))
      (if (< 100000 (funcall fn (+ 1 i)))
          nil
         (* 1.0 (funcall fn (+ 1 i)))))))
Если последовательность сходится возвращает приближённое значение предела с заданной точностью.
CL-USER> (lim #'(lambda(n)(/ 1 n)) 0.0001)
0.00990099
Если расходится - nil
CL-USER> (lim #'(lambda(n)(* n n)) 0.0001)
NIL
Но если вызов функции выглядит как-нибудь так:
(lim #'(lambda(n)(/ n (- 5 n))) 0.00001)
То получаем деление на ноль и ошибку. Как заставить lim фильтровать подобные аргументы принимаемой в качестве аргумента последовательности?

Решение задачи: «Некорректные аргументы функции принимаемой в качестве параметра»

textual
Листинг программы
(lim #'(lambda(n) (/ 1 (- n 1.999999))) 0.0001)
(lim #'(lambda(n) (/ 1 (- n 2.000001))) 0.0001)

Объяснение кода листинга программы

В этом коде используется функция lim, которая принимает два аргумента: предикат (predicate) и шаг (step).

  1. Предикат - это функция, которая принимает один аргумент (в данном случае n) и возвращает логическое значение (true или false). В данном случае предикат представлен лямбда-функцией, которая всегда возвращает true. То есть, она всегда считает, что выражение 1 / (n - 1.999999) является действительным числом.
  2. Шаг (step) - это функция, которая принимает один аргумент (в данном случае n) и возвращает следующий элемент последовательности. В данном случае шаг также представлен лямбда-функцией, которая увеличивает значение n на 0.0001. Функция lim принимает эти два аргумента и итерирует по последовательности, проверяя, является ли текущее значение функции предиката действительным числом. Если это так, оно возвращает текущее значение функции step. В первом примере кода шаг равен 0.0001, а предикат всегда возвращает true. Поэтому lim будет итерировать по последовательности, начиная с n = 0, и выводить каждое следующее действительное число, умноженное на 1 / (n - 1.999999). Во втором примере кода шаг также равен 0.0001, но предикат возвращает false для n = 2.000001. Поэтому lim будет итерировать по последовательности, начиная с n = 2, и выводить каждое следующее действительное число, умноженное на 1 / (n - 2.000001).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы