Используя код схемы для решения квадратного уравнения? - PullRequest
3 голосов
/ 30 октября 2008

Я написал этот код схемы, чтобы вычислить одно решение квадратного уравнения a x2 + b x + c = 0

(define (solve-quadratic-equation a b c) (define disc (sqrt (- (* b b) (* 4.0 a c)))) (/ (+ (- b) disc) (* 2.0 a)))

Однако кто-то сказал мне, что эту процедуру трудно понять. Почему?

Как будет выглядеть очищенная версия этой процедуры? Пожалуйста, дайте мне знать, почему новую процедуру будет легче понять.

Спасибо

Ответы [ 2 ]

7 голосов
/ 30 октября 2008

Ну, одна из причин в том, что все это в одной строке. Вы можете сделать его более читабельным, используя что-то под названием pretty-printing , где вы разбиваете его на несколько строк и используете пробелы:

(define (solve-quadratic-equation a b c)
  (define disc (sqrt (- (* b b)
                        (* 4.0 a c))))
  (/ (+ (- b) disc)
     (* 2.0 a)))

Таким образом, вы можете более четко увидеть структуру выражений.

А вот цитата из SICP :

Нет предела (в принципе) глубины такого вложения и общей сложности выражений, которые может оценить интерпретатор Lisp. Мы, люди, смущены относительно простыми выражениями, такими как

(+ (* 3 (+ (* 2 4) (+ 3 5))) (+ (- 10 7) 6))

который переводчик с готовностью оценил бы как 57. Мы можем помочь себе, написав такое выражение в виде

(+ (* 3
      (+ (* 2 4)
         (+ 3 5)))
   (+ (- 10 7)
      6))

в соответствии с соглашением о форматировании, известном как pretty-printing , в котором каждая длинная комбинация записывается так, чтобы операнды были выровнены вертикально. Полученные отступы четко отображают структуру выражения.

1 голос
/ 30 октября 2008

Разве это не схема развития языка для решения проблемы? Признаюсь, я не знаю много схем, но я бы добавил отступ и добавил квадрат, подобный такому.

 (define (solve-quadratic-equation a b c)
     (define square (x) (* x x) 
     (define disc (sqrt (- (square b) (* 4.0 a c)))) 
                        (/ (+ (- b) disc) (* 2.0 a))))
...