将字符串替换为关联列表Scheme

时间:2013-11-09 03:28:20

标签: string list scheme racket

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

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

1 个答案:

答案 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))]))