2013-10-30 78 views
1

我寫返回所有列表的方法負奇數和積極 偶數刪除(字符串可以留),由原始的篩選過程中使用lambda。我也在避免使用遞歸,但這是困擾我的東西。 我至今是:程序的列表(方案)

(define (f2b lst) 
    (cond ((null? lst)'()) ; if the list is empty, return the empty list 
      ((pair? (car lst)) ; if the current element isn't a list 
       (filter (lambda (x) (or (even? x) (positive? x))) (car lst)) 
       (filter (lambda (x) (or (odd? x) (negative? x))) (car lst))) 

(else (string? (car lst)) ;otherwise, if the current element is a string, 
      (car lst)  ; then return that element   
      (f2b (cdr lst))))) 

我也不能確定我怎麼能在同一時間同時應用的篩選過程。

回答

0

它比這更簡單。所有你需要做的是filter的清單。你只需要適當的謂詞。

什麼時候要保留一個元素?你根據你想要刪除的內容來描述它,所以讓我們從這個開始。如果它是一個負數的奇數或正數偶數整數,並且將其他所有數據都放入其中,則可以將其刪除。將它分解爲更小的函數會更容易。

(define (positive-even? x) (and (positive? x) (even? x))) 
(define (negative-odd? x) (and (negative? x) (odd? x))) 
(define (remove-num? x) (or (positive-even? x) (negative-odd? x))) 

這個定義是否保留一個數字。但是列表元素可能不是數字。因此,我們 保持它,如果它不是一個數字,或者如果它不匹配remove-num?

(define (keep-element? x) (or (not (number? x)) (not (remove-num? x)) 

那麼你的功能,只是有來電過濾:

(define (f2b lst) (filter keep-element? lst)) 

似乎工作:

(f2b '(-4 -3 -2 -1 0 1 2 3 4 "a string" "another")) 
=> (-4 -2 0 1 3 "a string" "another") 

下面是它看起來像一個大honkin的功能:

(define (f2b lst) 
    (filter 
    (lambda (x) 
    (or (not (number? x)) 
     (not (or (and (positive? x) (even? x)) 
       (and (negative? x) (odd? x)))))) 
    lst) 

就個人而言,嵌套or not or and變得有點難以閱讀對我的口味......


好吧,顯然你已經嵌套的列表。所有您需要做的,是mapfilter用一個函數,它的結果是:

  • 時給出一個列表,返回(f2b lst)
  • 否則,返回元素不變。

我會離開它作爲一個練習你,因爲,如果你認爲我的函數可以嵌套列表上可能的工作,顯然你有很多做學習的......

+0

我嘗試運行此代碼,但它只是通過我的測試用例並打印整個列表。編輯:我應該澄清,我通過嵌套列表運行它。 – user2789945

+0

@ user2789945:你運行了我給的最後一個函數?你給了它什麼輸入? – Claudiu

+0

是的,它適用於常規列表,但是當我通過它通過一個嵌套列表,它打印的整個列表。 – user2789945