遵循哪种编程实践来评估方案中的表达

时间:2011-06-02 15:18:06

标签: functional-programming scheme

我正在解决htdp.org的问题。我想在方案中知道,这是一个更好的做法来评估具有像'+'或'*'这样的公共运算符的长表达式。

示例:

> (* 1 10 10 2 4)                 ; Version A
> (* 1 (* 10 (* 10 (* 2 4))))     ; Version B

我应该遵循A还是B.另外,我请考虑上面的代数表达式示例,如圆柱面积。

-Abhi

2 个答案:

答案 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)))))))

对我来说,第二个程序比第一个程序快得多。