第一个答案很好,但是:
;; poscheck function. Use it to assign positive lists from another lists.
;; example (define positives (poscheck '(1 2 -4 -5 0 3) '()))
;; positives -> '(3 2 1)
(define (poscheck l r)
(cond ((empty? l) r)
((positive? (car l)) (poscheck (cdr l) (cons (car l) r )))
(else (poscheck (cdr l) r))))
在这个答案中,我使用了尾递归,这基本上意味着使用一个变量来存储许多递归调用中的最终结果。
我们想考虑最坏的情况是什么,使其成为cond 函数中的第一个选项,在这种情况下,可能发生的最坏情况(使car 失败)是列表为空(检查(car '()) 做了什么)。所以我们想停在那里。如果列表为空,则表示我们已经检查了所有要检查的项目。
我们的下一个案例是当当前项目(car l) 为正时发生的情况,这意味着我们希望它出现在我们的最终结果中,因此我们将它添加到我们的结果存储变量中以在下一次递归调用中使用它通过做
(poscheck (cdr l) (cons (car l) r ))
这会使用列表的其余部分调用该函数,但会保存我刚刚检查的内容。
最后一种情况是在我们的最终列表中不需要当前项目时发生的情况,因此我们只需通过调用具有列表其余部分的函数和相同的结果存储变量而不改变它来忽略它。我们这样做:
(poscheck (cdr l) r)
仅此而已,没有 map,没有 filter,没有其他奇怪的功能(对于我们 DrRacket 中的新手而言)。
希望对你有所帮助,如有任何疑问,请不要犹豫!