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

Scheme 方案:从列表中删除某些内容并更新优先级,scheme,racket,Scheme,Racket,我正在尝试实现某种购物列表/队列类型的函数。我遇到一些问题的函数被优先级移除。我想传入一个数字和一个要删除的项目列表。如果它不在列表中,则只返回列表,但如果它在列表中,则删除它,然后返回优先级已更新的列表 例如,(removePriority 2购物清单)将返回: => (("Apple" 3) ("Milk" 2) ("Eggs" 1)) 我已经创建了一些可以工作的助手函数,并且可以成功地检查某个优先级是否在列表中,但是我仍然停留在那里 #lang scheme (define sh

我正在尝试实现某种购物列表/队列类型的函数。我遇到一些问题的函数被优先级移除。我想传入一个数字和一个要删除的项目列表。如果它不在列表中,则只返回列表,但如果它在列表中,则删除它,然后返回优先级已更新的列表

例如,(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)

只要有可能,您应该尽量使用现有的过程,您的一些过程也可以简化一些。首先,这些内容更简单,与您所写的内容相同:

(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))))

在您的示例中,
“鸡蛋”
的优先级应该是
0
,因为所有优先级都应该递减,对吗?在这种情况下,如果优先级大于移除的优先级,我只是降低优先级。非常有帮助!我只需要看看我如何能得到比我要移除的优先级更低的优先级来保持不变。非常感谢。最好的答案!非常感谢!!为了我自己的清楚,我只想问几个问题。我不熟悉sub1和filter。我假设sub1只是一个函数名?此外,“过滤器不是”特定的方案功能吗?编辑:sub1只意味着减去1。我理解。@user2411290
(sub1 x)
(-x1)
相同,
过滤器非
是特定于球拍的,与谓词被否定的
过滤器相同。
(define shopping-list '(("Apple" 4) ("Orange" 2)  ("Milk" 3) ("Eggs" 1)))
(removeByPriority 2 shopping-list)
=> '(("Apple" 3) ("Milk" 2) ("Eggs" 1))