0

update-or-add 是一个关联列表,包含一个整数 k 和一个字符串 str。如果关联列表中有与 k 相同的数字,则将关联的字符串替换为 str。

例如,(update-or-add empty 2 "new")=> (list 2 "new")

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

请注意,生成的列表必须是与alst具有相同相对顺序的键的关联列表(如果更新与现有键 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))]))

但是上面所说的第二个和第三个测试没有通过,谁能告诉我问题出在哪里以及如何纠正它?谢谢!

4

1 回答 1

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))]))
于 2013-11-09T03:39:37.857 回答