方案显示完美的方块

时间:2018-04-17 19:02:20

标签: scheme racket

我正在尝试创建一个带有一个参数的函数,并使用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)))
    )
  )
)

1 个答案:

答案 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)