第一個答案工作得很好,但是:
;; 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