2016-09-10 3 views
0

foldlistを使用してRacketで関数を記述する必要があります。これは、数値のリストを取り、その後の数値より大きいリスト要素を削除します。Racketでfoldrを使用して、後続の数値より大きいリスト内の数字を削除する方法

例:(排除-大きい(リスト1 2 3 5 4))(1 2 3 4)を生成する必要があり

Iはfoldrまたは任意の高次関数を使用せずにそれを行うことができ、私は理解できませんそれはfoldrでそれを出します。ここで私が持っているものです。

(define (eliminate-larger lst) 
    (filter (lambda (z) (not(equal? z null))) 
     (foldr (lambda (x y) 
      (cons (determine-larger x (rest lst)) y)) null lst))      
) 

(define (determine-larger value lst) 
    (if (equal? (filter (lambda (x) (>= x value)) lst) lst) 
     value 
     null) 
) 

決定-大きな値とリストに取ると、それがより大きいか、リスト内のすべての要素と等しい場合、その値を返します。そうでない場合、nullを返します。今度は、より大きな機能を排除することは、リストを通って、各値をそれ以降のすべての数のリストと共に決定するために渡すことを試みています。それが "良い"値であれば、リストにnullが入れられていなければ、それが返されてリストに入れられます。そして、最後にヌルがフィルタリングされています。私の問題は、foldr関数の現在の番号の後に続く数字のリストを取得しています。 "rest lst"を使用すると、そのような再帰的に行われていないので機能しません。 foldrのxの後ろの残りの数字はどのようにして得られますか?

答えて

1

私は本当に私はfoldrにXの後の数字の残りの部分を取得するにはどうすればよい

...私はあなたのために宿題をやっていないよ願っていますが、ここに行きますか?

あなたが右からリストを消費しているので、あなたは「Xの後の数字の残りの部分は」そのmemo引数として利用可能であるように、あなたのアキュムレータを構築することができます。

(define (eliminate-larger lst) 
    (foldr 
    (lambda (member memo) 
     (if (andmap (lambda (n) (<= member n)) memo) 
     (cons member memo) 
     memo)) 
    '() 
    lst)) 
(eliminate-larger (list 1 2 3 5 4)) ;; (1 2 3 4) 

あなたは、各繰り返しで全体のアキュムレータを横断するように強制しているように、これは、確かに素朴なソリューションですが、あなたは簡単に通過するたびに、あなたのメモに加えて、最大値を維持し、それと比較可能性。

+0

作品、ありがとう!私はandmapがどのように動作するのかを調べようとしていますが、それが何をしているのかは全く分かりません。 –

+0

'member'がアキュムレータリストのすべての要素であることを検証するために' andmap'が使用されています。 'filter'のような関数を使用するのと比べて、与えられたprocの_any_アプリケーションが'#f'を返すならば早期に返るという利点があります(例えば '(<= 5 4)')。 – pdoherty926

+0

@KeithCalderwoodあなたがこの答えに満足すれば、それを受け入れるでしょうか? – pdoherty926

0

作品次のとおりです。

(define (el lst) 
    (define (inner x lsti) 
    (if(empty? lsti) (list x) 
     (if(<= x (apply max lsti)) 
      (cons x lsti) 
      lsti))) 
    (foldr inner '() lst)) 

(el (list 1 2 3 5 4)) 

出力:

'(1 2 3 4) 

condのバージョンが好ましいかもしれない:

(define (el lst) 
    (define (inner x lsti) 
    (cond 
     [(empty? lsti) (list x)] 
     [(<= x (apply max lsti)) (cons x lsti)] 
     [else lsti] )) 
    (foldr inner '() lst)) 
関連する問題