2016-04-03 9 views
1

買い物リスト/待ち行列タイプの関数のソートを実装しようとしています。いくつかの問題を抱えている関数は、removeByPriorityです。削除するアイテムの番号とリストを渡したいと思います。リストに含まれていない場合は、リストを返すだけですが、リストにあれば削除して、優先順位を更新したリストを返します。私は仕事をするいくつかのヘルパー関数を作成しているスキーム:リストから何かを削除して優先度を更新する

=> (("Apple" 3) ("Milk" 2) ("Eggs" 1)) 

、そして成功した一定の優先順位があるか、リストにないかどうかを確認することができます。たとえば

、(removePriority 2ショッピングリスト)が返されますしかし、私はそこにこだわっています。

#lang scheme 

(define shopping-list '(("Apple" 4) ("Orange" 2) ("Milk" 3) ("Eggs" 1))) 

(define name (lambda (m) 
       (car m) 
       )) 

(define priority (lambda (m) 
        (car (cdr m)) 
        )) 

(define containsPriority 
    (lambda (k lst) 
    (cond 
     ((null? lst)#f) 
     ((equal? k (priority (car lst)))#t) 
     (else (containsPriority k (cdr lst))) 
    ) 
    ) 
) 

(removeByPriority k lst) 

(define removeByPriority 
    (lambda (k lst) 
    (if((not(containsPriority k lst))lst) 
     (equal? k (priority(car lst))) 
      (else(removeByPriority k (cdr lst))(cons (car lst))) 
     ) 
    ) 
    ) 

(removeByPriority 2 shopping-list) 
+1

、 '' Eggs''は全ての優先順位が減分されるべきであるので、 '0'の優先順位を持つべきですか? –

+0

この場合、優先度が削除された優先度よりも大きい場合は、優先度を減らしています。 – user2411290

答えて

3

可能な限り既存の手順を使用するようにしてください。いくつかの手順をもう少し簡略化することもできます。初心者の方は、あなたが書いたものと簡単で同等です:

(define name car) 
(define priority cadr) 

(define (containsPriority k lst) 
    (cond ((null? lst) #f) 
     ((equal? (priority (car lst)) k) #t) 
     (else (containsPriority k (cdr lst))))) 

ここは興味深い部分です。私たちは望んでいない、我々フィルタ値と優先順位を下げる結果のリストの上に、その後私たちマップ、確認後:要求されたとして

(define (removeByPriority k lst) 
    (if (not (containsPriority k lst)) 
     lst 
     (map (lambda (pair) 
      (list (name pair) 
        (if (< (priority pair) k) 
         (priority pair) 
         (sub1 (priority pair))))) 
      (filter-not (lambda (pair) 
         (equal? (priority pair) k)) 
         lst)))) 

をそれは動作します:あなたの例では

(define shopping-list '(("Apple" 4) ("Orange" 2) ("Milk" 3) ("Eggs" 1))) 
(removeByPriority 2 shopping-list) 
=> '(("Apple" 3) ("Milk" 2) ("Eggs" 1)) 
+0

非常に役に立ちました!私は、私が同じままにするために取り除くものよりも低い優先順位をどのように得ることができるかを知る必要があります。ありがとうございました! – user2411290

+0

本当にベストセラー!非常に高く評価!! – user2411290

+0

わかりやすい質問です。私はsub1とフィルターに慣れていない。私はsub1は単なる関数名だと思いますか?また、特定のスキーム関数を「フィルタではない」としますか?編集:sub1ちょうど1を引くことを意味します。私はそれを理解しています。 – user2411290

関連する問題