我正在解决htdp.org的问题。我想在方案中知道,这是一个更好的做法来评估具有像'+'或'*'这样的公共运算符的长表达式。
示例:
> (* 1 10 10 2 4) ; Version A
> (* 1 (* 10 (* 10 (* 2 4)))) ; Version B
我应该遵循A还是B.另外,我请考虑上面的代数表达式示例,如圆柱面积。
-Abhi
答案 0 :(得分:8)
真正的问题应该是,它们会产生不同的结果吗?让我们试试REPL:
>> (* 1 10 10 2 4)
800
>> (* 1 (* 10 (* 10 (* 2 4))))
800
>>
由于它们基本相同(使用你的例子),我选择在代码中使用较低的仪式/噪音。使用第一个。
答案 1 :(得分:1)
对此进行了一些跟进。当你谈论时间时,(* a b c ...)
不一定等同于(* (* a b) ...)
。
某些实现可能会识别常见操作,但尝试计算这两个阶乘的定义:
(define (f1 n)
(let loop ((up 2)
(down n)
(a 1))
(cond ((> up down) a)
((= up down) (* a up))
(else
(loop (+ 1 up) (- 1 down)
(* a up down))))))
(define (f2 n)
(let loop ((up 2)
(down n)
(a 1))
(cond ((> up down) a)
((= up down) (* a up))
(else
(loop (+ 1 up) (- 1 down)
(* a (* up down)))))))
对我来说,第二个程序比第一个程序快得多。