方案:从列表中删除内容并更新优先级

时间:2016-04-03 17:26:30

标签: scheme racket

我正在尝试实现一种购物清单/队列类型的功能。我遇到一些问题的功能是removeByPriority。我想传递一个数字和一个要删除的项目列表。如果它不在列表中,则只返回列表,但如果它在列表中,则将其删除,然后返回更新优先级的列表。

例如,(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 个答案:

答案 0 :(得分: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))