【问题标题】:Is my implementation of SICP Exercise 1.3 going in the right direction?我的 SICP 练习 1.3 的实施是否朝着正确的方向发展?
【发布时间】:2020-08-09 15:05:39
【问题描述】:

SICP 中的练习 1.3 要求定义一个以 3 个数字作为参数并返回 2 个最大数字的平方和的过程。我想我说得对,但我不确定我是否涵盖了所有情况。我的实现如下:

(define (bigsq a b c)
    (cond ((and (> a b) (> b c)) (+ (* a a) (* b b)))
          ((and (> a b) (not (> b c))) (+ (* a a) (* c c)))
          ((> c a) (+ (* b b) (* c c)))
          (else (+ (* a a) (* b b))))

有没有办法将前两个条件也写成一个?也欢迎任何关于效率的 cmets。

【问题讨论】:

  • @Renzo 问题是代码是否正确。关于风格的部分是旁白。
  • (not (> b c))(<= b c)
  • 您应该能够为所有可能性生成测试用例,它们的数量并不多。 3个不同数字的6个排列,3个相同数字的1个排列。当其中 2 个相等时,有 3 个排列,其中第三个最高,3 个排列第三个最低。所以总共要测试 13 个案例。
  • 直到那时为止,这本书看起来好像
  • 就我个人而言,我同意仅使用本书中介绍的特性,但本着这种精神,您应该考虑使用本节前面介绍的平方和过程。 (fwiw 使用 'if' 而不是 'cond' stackoverflow.com/a/610719/53252 可能效率更高)

标签: scheme sicp


【解决方案1】:

对于初学者,我们可以使用一个帮助程序来实现一次sum

(define (sum x y)
  (+ (* x x) (* y y)))

现在,对于条件:考虑到顺序无关紧要 - (sum a b)(sum b a) 相同,只需要考虑 4 种情况,我们可以通过嵌套 if 来避免重复一些比较年代:

(define (sum-max a b c)
  (if (>= a b)
      (if (>= b c)
          (sum a b)
          (sum a c))
      (if (>= a c)
          (sum b a)
          (sum b c))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多