2017-07-16 2 views
-6

私はスキームが新しく、私は提案されたエクササイズを解決しようとしています。スキームプログラミングエクササイズ

2つの関数を取り、述語(引数としても渡される)が#tを返すときに最初の関数を適用するプロシージャ "filteredmap"を記述します。述語が#fを生成するときに第2の関数を適用する。

例:

> (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 pg h = map([x] => p x?g x:h x)'です。 –

+0

本当に自分の宿題を自分で解決しようとする前に、他の人にあなたのためにそれをするように依頼してください。これはStack Overflowのためのものではなく、学習するのではなくあなた自身をだますだけです。 –

答えて

-1

mapを使用して解決できます。 odd?,add1sub1のような3つの関数があり、代わりに同じ結果を得るためにmapを使用したければ、最初の引数として渡すラムダをどのように構築しますか?

あなたはちょうどあなたの代わりに3つの部分を命名した変数を使用してmapを同じように使用しますが、filteredmapを作るためにそれを使用することができます知っています。簡単なピーシー。

-1

fold-rightのような高次関数を使うこともできますし、lambdaを使ってマップを使うこともできますし、最初の要素を読むことで "後方に"リストを返す反復解を使うこともできます正確なマップとアキュムレータをcdrとして呼び出すと、末尾に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 '())))