Добавить символ в список частот
У меня есть проект о кодировании Хаффмана, и я застрял, я не понимаю, почему мой код не работает.
Это упражнение:
Написать функцию
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))