Куда поставить условие? - Lisp

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

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

Реализовать замыкание следующим образом: необходимо, чтобы квадрат числа (которое при замыкании увеличивается на 0,01) стал приблизительно равным числу у (которое должно быть подкоренным выражением, но,когда я использую функцию sqrt возникает ошибка, но это не главное). То есть нужно сделать так,чтобы замыкание остановилось, когда мое число станет больше,чем у. Ругается на то,что моя переменная X2 не имеет значения.
Листинг программы
  1. (defun power (x1)
  2. (setq y 5)
  3. #'(lambda ()
  4. (setf x2 (* x1 x1))
  5. (setq x1 (+ x1 0.01))
  6. )
  7. (if (> x2 y) (print "The end"))
  8. )

Решение задачи: «Куда поставить условие?»

textual
Листинг программы
  1. (let ((y 5) (x 0)) ;; замыкание - генератор последовательных приближений кв. корня
  2.   (defun reset () (setq x 0))
  3.   (defun power ()
  4.     (if (> (* x x) y) x (setq x (+ x 0.01))))) ;; если условие достигнуто - генератор будет возвращать одно и то же
  5.  
  6. ==> power
  7.  
  8. ;; в бесконечном цикле ловим момент, когда генератор начинает
  9. ;; возвращать одно и то же
  10.  
  11. (let ((c (power)) (p 0) (n 0))
  12.   (loop  
  13.      (cond ((< (abs (- c p)) 0.000001) (printsline "The end") (return (list n c)))
  14.            (t (setq p c c (power) n (+ n 1))))))
  15.  
  16. The end
  17.  
  18. ==> (224 2.24)  ;; достигнуто на 224 вызове
  19.  
  20. ;; Утилизировано ячеек: 0; атомов: 658.
  21.  
  22. (* 2.24 2.24) ;; проверка
  23.  
  24. ==> 5.0176
  25.  
  26. ;; Вторая попытка
  27.  
  28. (let ((c (power)) (p 0) (n 0))
  29.   (loop
  30.      (cond ((< (abs (- c p)) 0.000001) (printsline "The end") (return (list n c)))
  31.            (t (setq p c c (power) n (+ n 1))))))
  32.  
  33. The end
  34.  
  35. ==> (1 2.24) ;; достигнуто сразу же
  36.  
  37. (reset) ;; сброс генератора
  38.  
  39. ==> 0
  40.  
  41. (let ((c (power)) (p 0) (n 0))
  42.   (loop
  43.      (cond ((< (abs (- c p)) 0.000001) (printsline "The end") (return (list n c)))
  44.            (t (setq p c c (power) n (+ n 1))))))
  45.  
  46. The end
  47.  
  48. ==> (224 2.24) ;; снова 224 виток
  49.  
  50. ;; Утилизировано ячеек: 0; атомов: 647.

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

Код представляет собой реализацию метода Ньютона для вычисления квадратного корня. Вот список элементов кода с их номерами:

  1. (let ((y 5) (x 0)) ;; замыкание - генератор последовательных приближений кв. корня
  2. (defun reset () (setq x 0))
  3. (defun power ()
  4. (if (> (* x x) y) x (setq x (+ x 0.01))))) ;; если условие достигнуто - генератор будет возвращать одно и то же
  5. (let ((c (power)) (p 0) (n 0))
  6. (loop
  7. (cond ((< (abs (- c p)) 0.000001) (printsline The end) (return (list n c)))
  8. (t (setq p c c (power) n (+ n 1))))))
  9. (reset) ;; сброс генератора
  10. (let ((c (power)) (p 0) (n 0))
  11. (loop
  12. (cond ((< (abs (- c p)) 0.000001) (printsline The end) (return (list n c)))
  13. (t (setq p c c (power) n (+ n 1))))))
  14. The end
  15. (224 2.24) ;; достигнуто на 224-м вызове
  16. (* 2.24 2.24) ;; проверка
  17. 5.0176
  18. (let ((c (power)) (p 0) (n 0))
  19. (loop
  20. (cond ((< (abs (- c p)) 0.000001) (printsline The end) (return (list n c)))
  21. (t (setq p c c (power) n (+ n 1))))))
  22. The end
  23. (1 2.24) ;; достигнуто сразу же
  24. (reset) ;; сброс генератора
  25. (let ((c (power)) (p 0) (n 0))
  26. (loop
  27. (cond ((< (abs (- c p)) 0.000001) (printsline The end) (return (list n c)))
  28. (t (setq p c c (power) n (+ n 1))))))
  29. The end
  30. (224 2.24) ;; снова 224-й виток
  31. Утилизировано ячеек: 0; атомов: 647. Код начинается с определения функции power, которая генерирует последовательность приближений квадратного корня. Функция reset сбрасывает генератор. Затем следует бесконечный цикл, который завершается, когда генератор начинает возвращать одно и то же значение. В этом случае выводится сообщение The end и возвращается список с номером и значением, которые достигли конвергенции. После этого происходит проверка полученного значения, вычисляется квадрат этого значения, и снова проверяется, достигнуто ли условие конвергенции. Затем происходит сброс генератора и повторный расчет квадратного корня. Когда условие конвергенции достигнуто, код завершается, выводится сообщение The end и возвращается список с номером и значением, которые достигли конвергенции.

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


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

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

14   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы