2016-04-03 78 views
1

我試圖執行某種購物清單/隊列類型的功能。我有一些問題的功能是removeByPriority。我想通過一個數字和一個項目列表刪除。如果它不在列表中,那麼只需返回列表,但是如果它在列表中,則將其刪除,然後返回一個列表,其優先級已更新。Scheme:從列表中刪除某些內容並更新優先級

例如,(removePriority 2購物列表)將返回:

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

我已經創造了一些輔助函數做的工作,並能成功地檢查某個優先級是否是或不是在列表中,但我卡在那裏。

#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和filter-not。我假設sub1只是一個函數名稱?另外,「過濾器不是」具體的方案功能?編輯:sub1只是意味着減去1.我明白這一點。 – user2411290