2017-03-07 112 views
0

所以我的輸入是一些列表l,並且該函數的目標是獲取所有肯定的結果並用這些正值創建一個新列表。這是我目前有:Scheme:返回一個正值列表

(define (positives l) 
    (define (poscheck l) 
    (cond ((negative? (car l)) '()) 
      ((null? l) '()) 
      (else (poscheck (cdr l))))) 
(list (poscheck l))) 

出於某種原因,它不斷告訴我,它檢查(車L)時給了一個空列表。我不完全確定它會爲錯誤提供什麼。任何幫助修復此代碼將不勝感激。

+0

你約束爲使用任何映射函數如[圖](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)? –

+0

地圖很好,但我們還沒有過濾過。 – Tom

回答

2

所以我喜歡首先檢查簡單的事情。

(positives '()) ; ==> ERROR 

所以對於一個空的列表中,您首先檢查的第一個元素是負的..但在此之前,你可以進一步檢查,如果第一個元素smoething一個空表必須明確進行檢查。

(positives '(-1 2 3)) ; ==> (()) 

如果第一個元素是負的助手會停止並做..難道不應該只是跳過第一個元素?

最後一個觀察結果是,如果一個數字是肯定的,你應該把它添加到答案中,將元素包含到剩下的elist的遞歸中。它現在所做的是,如果實際上元素是否定的,會發生什麼。

沒有理由將結果包裝在list中。如果poscheck返回(1 2 3)positives將使其成爲((1 2 3))

把它包起來就應該是這個樣子被填充到...

(define (positives lst) 
    (cond ((null? lst) '()) 
     ((negative? (car lst)) (positives ...)) 
     (else (cons ... (positives ...))))) 

技術上這個假設零爲陽性。通過在最後兩項中切換地點並使用positive?它將省略零。

+0

非常感謝! – Tom

1

第一個答案工作得很好,但是:

;; 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)。

希望它對你有所幫助,如果你有任何疑問不要猶豫,在詢問!

0

使用named let可能有助於澄清只得到陽性(內聯註釋被添加)的處理:

(define (onlyPositives L) 
    (let loop ((L L)    ; start with full list 
      (ol '()))   ; and an empty outlist 
    (cond 
     [(empty? L)    ; if end of list reached, return outlist (reversed since cons adds at head of list); 
     (reverse ol)] 
     [(positive? (car L))  ; if first item is positive, loop with rest of list and first item added to outlist; 
     (loop (cdr L) 
      (cons (car L) ol))] 
     [else      ; else loop with rest of list without adding item to outlist; 
     (loop (cdr L) 
      ol)] 
    )))