我正在尝试编写一个Racket函数,它接受一个数字列表作为输入,并输出列表中那些完美正方形的数字的平方根的总和。我目前的代码没有编译,如下:
(define (sum-of-perfect-roots lst)
(apply + (map (lambda (number)
(sqrt number)) (filter (exact? sqrt(number)) lst))))
我知道我的错误在于过滤函数的谓词用法。我不知道如何正确地返回唯一完美正方形的列表。任何帮助表示赞赏!
答案 0 :(得分:0)
Racket实际上有一个内置的数学库,math/number-theory
模块提供了方便的perfect-square
function。 perfect-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)))