我正在尝试创建一个带有一个参数的函数,并使用map,apply和/或filter的组合来仅返回完美正方形的数字。例如。
> (perfect-squares `(1 2 3 4 5 6 7 8 9))
(1 4 9)
> (perfect-squares '(15 16 17 24 25 26 25))
(16 25 25)
> (perfect-squares '(2 3 5 6))
()
我设法做了类似的事情,但不是显示完美正方形的数字,而是显示不正确的数字。另外,我无法理解map,apply和filter的实现。这是迄今为止的目标。
(define (perfect-squares li)
(cond
((null? li) '())
((integer? (sqrt (car li)))
(perfect-squares (cdr li)))
(else
(cons (car li) (perfect-squares (cdr li)))
)
)
)
答案 0 :(得分:3)
将任务分成子任务最简单。这是一个根据你给出的逻辑识别正方形的函数:
(define (square? n) (integer? (sqrt n)))
然后您可以使用filter
来识别正方形:
> (filter square? '(1 2 3 4 5 6 7 8 9))
(1 4 9)
你的计划是倒退的。当数字不是正方形时,你应该重复,当它是:
时,它应该累积到累积输出(define (perfect-squares li)
(define (perfect-squares-helper li result)
(cond ((null? li) result)
((integer? (sqrt (car li)))
(perfect-squares-helper (cdr li) (cons (car li) result)))
(else (perfect-squares-helper (cdr li) result))))
(perfect-squares-helper li '()))
请注意,这会以相反的顺序返回结果,这是将结果累积到列表中的特征:
> (perfect-squares '(1 2 3 4 5 6 7 8 9))
(9 4 1)
顺便说一句,你在不同行上放置右括号的方法是由经验丰富的Scheme程序员普遍避免的。只需将它们堆叠在最后一行代码的末尾。
编辑:在评论中,Renato询问如何在函数内部使用map,filter和apply。我们不需要地图或应用,但这里是使用过滤器的功能:
(define (perfect-squares xs)
(define (square? x)
(integer? (sqrt x)))
(filter square? xs))
> (perfect-squares '(1 2 3 4 5 6 7 8 9))
(1 4 9)