Добавить символ в список частот

У меня есть проект о кодировании Хаффмана, и я застрял, я не понимаю, почему мой код не работает.

Это упражнение:

Написать функцию add1 который, учитывая символ, добавляет 1 к его частоте в списке частот. Если персонажа еще нет в списке частот, он добавляется.

(add1 "e" '(("l" 1) ("e" 2) ("x" 1)))       →          (("l" 1) ("e" 3) ("x" 1)) 
(add1 "e" '(("a" 4) ("b" 3)))               →          (("a" 4) ("b" 3) ("e" 1)) 

То, что я написал:

(define add1
  (lambda (c l) 
    (if (null? l)
        '()
        (if (member? c l)
            (if (equal? c (caar l))
                (+ 1 (cadar l))
                (add1 c (cdr l)))
            (append l '((c 1)))))
        ))

Результат:

(list (list "l" 1) (list "e" 2) (list "x" 1) (list 'c 1))

1 ответ

Решение

Плохая идея звонить add1 процедура, которая конфликтует со встроенной процедурой с тем же именем. Попробуйте это вместо этого:

(define add-one
  (lambda (c l)
    (cond ((null? l)
           (list (list c 1)))
          ((equal? (caar l) c)
           (cons (list c (+ 1 (cadar l))) (cdr l)))
          (else
           (cons (car l) (add-one c (cdr l)))))))

Посмотрите, как, если мы дойдем до пустого списка, это потому, что символ не был найден в списке, поэтому мы должны добавить его в конце. Два других случая говорят сами за себя: либо символ является текущим, либо символ находится в остальной части списка. При написании решения таким образом, нет необходимости использовать member?, Работает как положено:

(add-one "e" '(("l" 1) ("e" 2) ("x" 1)))
=> (("l" 1) ("e" 3) ("x" 1)) 

(add-one "e" '(("a" 4) ("b" 3)))
=> (("a" 4) ("b" 3) ("e" 1))
Другие вопросы по тегам