完美根实施的球拍和

Racket Sum of Perfect Roots Implementation

我正在尝试编写一个 Racket 函数,它将一个数字列表作为输入,并输出列表中那些数字的平方根之和,这些数字是完全平方数。我目前的代码无法编译,如下:

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

我知道我的错误在于过滤函数的谓词的使用。我不知道如何 return 正确地列出只有完全正方形的列表。任何帮助表示赞赏!

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

Returns (sqrt m) if m is perfect square, otherwise #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)))