SICP / Scheme: процедура, которая принимает список пар и элемент, возвращает список пар - PullRequest
2 голосов
/ 13 апреля 2019

У меня есть некоторые проблемы с этой проблемой, которую мне дали. Это не домашняя работа, на самом деле это проблема, с которой я столкнулся на тесте, и чтобы углубить свое понимание, я хотел бы решить ее успешно.

Проблема в следующем: создайте процедуру element-count, которая берет список пар "lst" и элемент "el" и возвращает список пар, где, если элемент "el" существует в "lst" в качестве первого члена, тогда второй член получает увеличено на 1. В конце «первой» мы добавим пару (минусы 1). Требуемый результат: element-count '((a 2)) b) ->' ((a 2 (b 1))

Вот так выглядит мой код:

#lang sicp
(define (append list1 list2)
  (if (null? list1)
      list2
      (cons (car list1) (append (cdr list1) list2))))

(define (count-element lst el)
  (cond ((eq? (car lst) el) (+ (cdr lst) 1))
  (else (append lst (cons (el 1))))))

Первая проблема, с которой я столкнулся, это то, что она говорит мне, что «b» не определено. Очевидно, что b не нужно определять, так как я хочу его в своем выводе. Как мне это исправить? Среда, в которой я работаю - это DrRacket. Главный вопрос: как мне определить список пар? Или мой код на самом деле хорошо? Списки и пары все еще довольно запутаны, поэтому я прошу прощения за глупые вопросы.

1 Ответ

3 голосов
/ 13 апреля 2019

Вы очень близки к правильному решению;Я думаю, что существует некоторая путаница в том, как определяются списки и пары.Вот реализация и использование count-element, которое делает то, что вы хотите:

(define (count-element lst el)
  (cond ((eq? (car lst) el) (+ (cdr lst) 1))
  (else (append lst (list (cons el 1))))))

(count-element (list (cons 'a 2)) 'b)

Следует отметить две вещи.

Первый , способ определениясписок пар выглядит следующим образом:

(list (cons 'a 1) (cons 'c 2))

или

'((a . 1) (c . 2))

Второй , это правильный способ использования вашего метода append:

(append lst (list (cons 'b 1)))

или

(append lst '((b . 1)))

Это потому, что append определен так, что вы передаете два списка, и он объединяет их в один новый список.Вот почему вторым параметром является список, содержащий пару, которую вы хотите добавить.

...