2013-03-22 20 views
3

我目前正在使用MIT方案開展家庭作業任務,並且遇到了幾個很短的問題,儘管我對如何實現其中的一些問題有些困惑。計劃 - 帶過濾器的列表函數

一個問題要求我編寫一個函數,該函數返回一個刪除了所有整數的列表。我還是設法解決這個問題,

(define (f2a lst) (map (lambda(x) (remove number? x)) lst)) 

雖然我很困惑,我該怎麼把它改寫爲不使用刪除,而是使用一個過濾器。 *備註:(f2a '(("a" 1 "b") (2 "c") (-1 "d") (-2)))返回'(("a" "b") ("c") ("d"))

另外兩個問題是我沒有找到任何解決方案的問題。

他們問我編寫一個函數,返回一個列表,其中包含所有正奇數和負偶數整數。例如,

(f2b '(("a" 1 "b") (2 "c") (-1 "d") (-2))) 

回報

(("a" "b") (2 "c") (-1 "d")) 

我有一些代碼下來是不正確的,但我覺得說明我是如何試圖接近解決這一個:

(define (f2b lst) 
    (lambda(x) 
    (cond ((and (positive? x) (odd? x)) (filter x lst)) 
     ((and (negative? x) (even? x)) (filter x lst)) 
     (else "this should never print")))) 

最後問題只是要求一個函數返回一個由列表中所有字符串組成的字符串。 (f2c '(("a" 1 "b") (2 "c") (-1 "d") (-2)))返回「abcd」。

我幾乎設法找出這一個,但當它不斷返回奇怪的值時卡住了。這是我的代碼:

(define (f2c lst) 
    (lambda(x) 
    (map (lambda (x) (filter string? x)) lst) 
    (list x)) 
    (string-append (car lst) (cdr lst))) 

就高階語法而言,我僅限於映射,過濾,累加和求和。我不是要求直接回答,而是幫助我弄清楚我需要做什麼。我在做什麼錯我的代碼?任何援助與此非常讚賞。謝謝。

+0

[文檔](http://www.gnu.org/software/mit-scheme/documentation/mit-scheme-ref/Filtering-Lists.html#Filtering-Lists)for'remove'說,「Like過濾器,除了返回的列表僅包含那些不滿足謂詞的元素。「因此,要使用'filter'而不是'remove',只是否定謂詞。 – 2013-05-09 19:50:19

回答

1

輸入和期望輸出的結構在前兩個問題中是相同的;唯一不同的是謂詞何時何時不移除元素。對於第二種情況下,這將是:

(define (f2b lst) 
    (map (lambda (sublst) 
     (remove (lambda (x) 
        (and (number? x) 
         (or (and (positive? x) (odd? x)) 
          (and (negative? x) (even? x))))) 
       sublst)) 
     lst)) 

由於只有謂詞有所不同,你可以概括這個爲:

(define (f2x predicate) 
    (lambda (lst) 
     (map (lambda (sublst) (remove predicate sublst)) lst))) 
    (define f2a (f2x number?)) 
    (define f2b (f2x (lambda (x) 
        (and (number? x) 
          (or (and (positive? x) (odd? x)) 
           (and (negative? x) (even? x)))))) 

爲了您的最後一個問題,你可以使用的第一個問題的結果

(define (f2c lst) 
    (apply string-append (apply append (f2a list)))) 

此外,請注意您的語法f2b和f2a是不正確的。您正在使用

(define (func arg) 
    (lambda (x) ...)) 

這意味着(func arg)返回的功能不是你想要的。

+1

感謝您解釋一些事情,儘管我注意到有兩件事情是關閉的:對於f2b代碼,它看起來並不完全正常,因爲它在運行時會檢查一個字符串的整數值並返回一個錯誤(即對象「派」,作爲第一個參數傳遞給整數負數?,是不正確的類型) 。此外,對於您在f2c列表中發佈的代碼,我無法評論這是否正確,因爲在當前我正在使用的課程中,我們還沒有足夠使用這樣的代碼。 – CodeRook 2013-03-22 15:39:28

+0

我已添加號碼?到謂詞。 – GoZoner 2013-03-22 15:42:46