update-or-add是一个关联列表,包含一个整数k和一个字符串str。如果在关联列表中有一个与k相同的数字,则它用str替换关联的字符串。
例如, (update-or-add empty 2“new”)=> (清单2“新”)
(update-or-add
(list (list 3 "three") (list 1 "one") (list 2 "two")) 3 "new3")
=> (list (list 3 "new3") (list 1 "one") (list 2 "two"))
(update-or-add
(list (list 3 "three") (list 1 "one") (list 2 "two")) 0 "z")
=> (list (list 3 "three") (list 1 "one") (list 2 "two") (list 0 "z"))
请注意,生成的列表必须是一个关联列表,其中的键与相同的相对顺序一样(如果更新与现有键k关联的值,如第一个示例中所示),如果添加一个新的密钥和值,这个新的关联应该在alst的末尾添加(如第三个例子中所示)。
现在这是我的代码:
(define (update-or-add alst k v)
(cond
[(empty? alst) (list k v)]
[(equal? (first (first alst)) k)
(cons (list (first(first alst)) v)
(add-or-update (rest alst) k v))]
[else (cons (first alst) (update-or-add (rest alst) k v))]))
但是上面提到的第二次和第三次测试没有通过,有人能告诉我问题出在哪里以及如何纠正它?谢谢!
答案 0 :(得分:0)
如果要使用递归函数,则基本情况需要与常规模式匹配。 含义
(update-or-add empty 2 "new") => '((2 "new"))
这应该这样做
(define (add-or-update alst k v)
(cond [(empty? alst) (list(list k v))]
[(equal? (first (first alst)) k) (cons (list k v) (rest alst))]
[else (cons (first alst) (add-or-update (rest alst) k v))]))