完美根实施的球拍和
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
function。 perfect-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)))
我正在尝试编写一个 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
function。 perfect-square
的文档描述如下:
Returns
(sqrt m)
ifm
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)))