我编写了这个方案代码来计算二次方程 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)))
但是,有人告诉我,这个程序很难理解。为什么?
这个过程的清理版本会是什么样子?请让我知道为什么新程序更容易理解。
谢谢
我编写了这个方案代码来计算二次方程 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)))
但是,有人告诉我,这个程序很难理解。为什么?
这个过程的清理版本会是什么样子?请让我知道为什么新程序更容易理解。
谢谢
嗯,一个原因是它都在一条线上。你可以使用一种叫做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的格式约定,其中写入每个长组合,以便操作数垂直对齐。生成的缩进清楚地显示了表达式的结构。
计划不就是开发一种语言来解决问题吗?我承认我不太了解方案,但我会添加一些缩进并添加一个类似这样的正方形定义。
(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))))