我正在尝试实现一种购物清单/队列类型的功能。我遇到一些问题的功能是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)
答案 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))