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

发布于 2024-11-13 08:06:18 字数 269 浏览 0 评论 0原文

我正在解决来自 htdp.org 的问题。我想知道在方案中,哪种方法是评估具有“+”或“*”等常见运算符的长表达式的更好做法。

示例:

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

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

-阿比

I am solving problems from htdp.org. I would like to know in scheme which is a better practice to evaluate long expressions having a common operator like '+' or '*'.

Example :

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

Should I follow A or B. Also I please consider the above example for algebraic expressions like surface area of cylinder.

-Abhi

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最单纯的乌龟 2024-11-20 08:06:18

真正的问题应该是,它们会产生不同的结果吗?让我们在 REPL 中尝试一下:

>> (* 1 10 10 2 4)
800
>> (* 1 (* 10 (* 10 (* 2 4))))
800
>> 

因为它们本质上是相同的(使用您的示例),所以我选择在代码中使用较低的仪式/噪音。使用第一个。

The real question should be, do they produce different results? Let's try in our REPL:

>> (* 1 10 10 2 4)
800
>> (* 1 (* 10 (* 10 (* 2 4))))
800
>> 

Since they're essentially the same (using your example), I'd opt for going with lower ceremony / noise in the code. Use the first one.

怼怹恏 2024-11-20 08:06:18

对此有一点后续。当您谈论计时时, (* abc ...) 不一定等同于 (* (* ab) ...)

某些实现可能会识别常见操作,但请尝试对阶乘的这两个定义进行计时:

(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)))))))

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

A bit of a followup on this. (* a b c ...) is not necessarily equivalent to (* (* a b) ...) when you're talking about timing.

Some implementations may recognize the common operation, but try timing these two definitions of factorial:

(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)))))))

The second procedure is considerably faster than the first for me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文