Некорректные аргументы функции принимаемой в качестве параметра - Lisp
Формулировка задачи:
Допустим есть функция для определения предела последовательности.
Если последовательность сходится возвращает приближённое значение предела с заданной точностью.
Если расходится - nil
Но если вызов функции выглядит как-нибудь так:
То получаем деление на ноль и ошибку.
Как заставить lim фильтровать подобные аргументы принимаемой в качестве аргумента последовательности?
(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
CL-USER> (lim #'(lambda(n)(* n n)) 0.0001) NIL
(lim #'(lambda(n)(/ n (- 5 n))) 0.00001)
Решение задачи: «Некорректные аргументы функции принимаемой в качестве параметра»
textual
Листинг программы
(lim #'(lambda(n) (/ 1 (- n 1.999999))) 0.0001) (lim #'(lambda(n) (/ 1 (- n 2.000001))) 0.0001)
Объяснение кода листинга программы
В этом коде используется функция lim, которая принимает два аргумента: предикат (predicate) и шаг (step).
- Предикат - это функция, которая принимает один аргумент (в данном случае n) и возвращает логическое значение (true или false). В данном случае предикат представлен лямбда-функцией, которая всегда возвращает true. То есть, она всегда считает, что выражение
1 / (n - 1.999999)
является действительным числом. - Шаг (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).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д