球拍 - 从关联列表中删除一个键
Racket - Remove a key from association list
我正在尝试编写一个函数,该函数使用一个数字、键和一个关联列表 al,并生成从 al 中删除键的关联列表。
例如:
(check-expect (remove-al 5 (list (list 4 "A") (list 5 "B") (list 1 "C")))
(list (list 4 "A") (list 1 "C")))
我不被允许使用某些功能,如映射、过滤或删除,但到目前为止我已经写好了。下面是我的代码:
define (remove-al key al)
(cond
[(empty? al) empty]
[(= key (first (first al))) empty]
[else (cons (first al)
(remove-al key (rest al)))]))
我的代码哪一部分是错误的?
此算法背后的概念是根据扩展的追加实现来考虑它。如果你要在 Racket 中查找 append 的实现,它是一个递归算法,其中基本情况检查 rhs 列表是否为空,但如果不是,它会将 lhs 列表的第一个值作为递归调用的结果其余的 lhs 列表和 rhs。 是一个link的实现。该算法只是带有额外检查的附加实现,以确保在列表的第一个元素与键匹配时忽略 cons 递归调用。
剧透
---->
(define (remove-al key lhs rhs)
(cond [(empty? lhs) rhs]
[else (cond [(not (=(first (first lhs)) key))
(cons (first lhs) (remove-al key (rest lhs) rhs))]
[else (remove-al key (rest lhs) rhs)])]))
(check-expect (remove-al 5 (list (list 4 "A") (list 5 "B") (list 1 "C")) '() )
(list (list 4 "A") (list 1 "C")))
我正在尝试编写一个函数,该函数使用一个数字、键和一个关联列表 al,并生成从 al 中删除键的关联列表。 例如:
(check-expect (remove-al 5 (list (list 4 "A") (list 5 "B") (list 1 "C")))
(list (list 4 "A") (list 1 "C")))
我不被允许使用某些功能,如映射、过滤或删除,但到目前为止我已经写好了。下面是我的代码:
define (remove-al key al)
(cond
[(empty? al) empty]
[(= key (first (first al))) empty]
[else (cons (first al)
(remove-al key (rest al)))]))
我的代码哪一部分是错误的?
此算法背后的概念是根据扩展的追加实现来考虑它。如果你要在 Racket 中查找 append 的实现,它是一个递归算法,其中基本情况检查 rhs 列表是否为空,但如果不是,它会将 lhs 列表的第一个值作为递归调用的结果其余的 lhs 列表和 rhs。
剧透
---->
(define (remove-al key lhs rhs)
(cond [(empty? lhs) rhs]
[else (cond [(not (=(first (first lhs)) key))
(cons (first lhs) (remove-al key (rest lhs) rhs))]
[else (remove-al key (rest lhs) rhs)])]))
(check-expect (remove-al 5 (list (list 4 "A") (list 5 "B") (list 1 "C")) '() )
(list (list 4 "A") (list 1 "C")))