第一个答案工作得很好,但是:
;; 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
,没有其他的怪异功能(我们newbs在DrRacket)。
希望它对你有所帮助,如果你有任何疑问不要犹豫,在询问!
你约束为使用任何映射函数如[图](HTTPS://docs.racket- lang.org/reference/pairs.html?q=Map#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29)?或者甚至更好,[过滤器](https://docs.racket-lang.org/reference/pairs.html?q=Map#%28def._%28%28lib._racket%2Fprivate%2Flist..rkt%29 ._filter%29%29)? –
地图很好,但我们还没有过滤过。 – Tom