2017-07-16 96 views
-6

我是新的計劃,我試圖解決一個建議的練習。我感謝你的想法,如何解決它,這是練習:計劃編程練習

編寫一個過程「filteredmap」,採用2個函數,並應用第一個函數時謂詞(也作爲參數傳遞)返回#t並在謂詞產生#f時應用第二個函數。

例子:

> (filteredmap even? (lambda (x) (+ x 1)) 
        (lambda (x) (* x 2)) 
        (list 1 2 3 4 5 6 7 8 9 10)) 
(2 3 6 5 10 7 14 9 18 11) 

> (filteredmap even? (lambda (x) "yes, yes, even!") 
        (lambda (x) "oh no!") 
        (list 1 2 3 4 5 6 7 8 9 10)) 

    ("oh no!" "yes, yes, even!" "oh no!" "yes, yes, even!" "oh no!" "yes, yes, 
    even!" "oh no!" "yes, yes, even!" "oh no!" "yes, yes, even!") 

任何想法如何實現它?謝謝你的幫助!

+0

'filteredmap p g h = map([x] => p x?g x:h x)'。 –

+0

你真的應該試着自己解決你的功課,然後再問別人爲你做。這不是Stack Overflow的原因,你只是在欺騙自己而不是學習。 –

回答

-1

您可以使用map來解決。想想看你是否有odd?,add1,sub1這三個函數,並想用map代替實現相同的結果,那麼如何構造你作爲第一個參數傳遞的lambda?

當您知道您可以使用它來製作filteredmap時,您只需使用map就可以使用相同的方式,但通過使用您命名爲3部分的變量來代替。十分簡單。

-1

您可以使用諸如摺疊權的高階函數,您可以使用lambdas使用地圖,也可以使用迭代解決方案,通過讀取第一個元素在「向後」列表中獲取答案並使用正確的地圖和累加器作爲cdr調用cons,因此您需要在最後調用reverse。這是我的解決方案:

(define (filteredmap predicate fun1 fun2 items) 
    (define (fm-iter pred f1 f2 lst acc) 
     (cond ((null? lst) acc) 
       ((pred (car lst)) (fm-iter pred f1 f2 (cdr lst) (cons (f1 (car lst)) acc))) 
       (else (fm-iter pred f1 f2 (cdr lst) (cons (f2 (car lst)) acc))))) 
    (reverse (fm-iter predicate fun1 fun2 items '())))