完美根源实施的球拍总和

时间:2015-02-17 03:32:47

标签: list scheme racket

我正在尝试编写一个Racket函数,它接受一个数字列表作为输入,并输出列表中那些完美正方形的数字的平方根的总和。我目前的代码没有编译,如下:

(define (sum-of-perfect-roots lst)
  (apply + (map (lambda (number)
                  (sqrt number)) (filter (exact? sqrt(number)) lst))))

我知道我的错误在于过滤函数的谓词用法。我不知道如何正确地返回唯一完美正方形的列表。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

Racket实际上有一个内置的数学库,math/number-theory模块提供了方便的perfect-square functionperfect-square的文档描述如下:

  

如果(sqrt m)为正方形,则返回m,否则为#f

当然,这使得实现您的功能变得微不足道。你可以这样做:

(require math/number-theory)

(define (sum-of-perfect-roots lst)
  (apply + (filter-map perfect-square lst)))

使用filter-map也更有效,因为它不需要两次构建列表。不过,如果您为了学习目的而推出自己的实现,重新实现perfect-square并不会非常困难。

(define (perfect-square n)
  (define root (sqrt n))
  (if (integer? root) root #f))

如果您想提高效率,可以避免使用fold完全构建中间列表。 Racket的for/sum理解表使这很容易实现。

(define (sum-of-perfect-roots lst)
  (for/sum ([n (in-list lst)])
    (or (perfect-square n) 0)))