Подсчет уникальных элементов в схеме - PullRequest
2 голосов
/ 08 марта 2011

Напишите рекурсивную процедуру count-dist для элементов схемы, которая берет список с дублирующимися элементами и возвращает количество отдельных элементов в списке.

Это мой код, но он работает неправильно. Пожалуйста помоги! Спасибо !!

(define (count-dist-elements lis)   
  (cond
    ((null? lis) 0)
    ((null? (cdr lis))0)
    ((member (car lis)(cdr lis)))
     (else(+ 1(count-dist-elements (cdr lis))))))

p / s: пусть будет (count-dist-elements '(1 2 1 1 2 3 4 5 5 6 6 7 7 8 8 8 9))

Ответы [ 3 ]

1 голос
/ 08 марта 2011

Похоже, вы довольно близко подходите.

  • Что происходит, когда вы передаете своей функции список с одним элементом?Что должна вернуть ваша функция в этом случае?
  • А как насчет двухэлементного списка с одним и тем же элементом (например, (5 5))?Ваша функция возвращает разумное значение?
0 голосов
/ 10 марта 2011
 (define (count-dist-elements lst dist-elems count)
   (cond ((null? lst) count)
         ((member (car lst) dist-elems)
          (count-dist-elements (cdr lst) dist-elems count))
         (else
          (count-dist-elements (cdr lst)
                               (cons (car lst) dist-elems)
                               (+ 1 count)))))

(count-dist-elements '(a b b c) '() 0) ==> 3

(count-dist-elements '(1 2 1 1 2 3 4 5 5 6 6 7 7 8 8 8 9) '() 0) ==> 9

Или, если вы хотите, чтобы это было рекурсивным, а не итерационным (и этодолжен использовать вызов функции, подобный показанному выше),

(define (count-dist-elements lst . dist-elems)
  (let ((dist-elems (if (null? dist-elems) '() (car dist-elems))))
    (cond ((null? lst) 0)
          ((member (car lst) dist-elems)
           (count-dist-elements (cdr lst) dist-elems))
          (else
           (+ 1 (count-dist-elements (cdr lst) (cons (car lst) dist-elems)))))))

Дает те же результаты.

(count-dist-elements '(1 2 1 1 2 3 4 5 5 6 6 7 7 8 8 8 9)) ==> 9

0 голосов
/ 08 марта 2011

Первое: почему вы возвращаете ноль в случае (null? (cdr lis))?

Второе: что, по вашему мнению, возвращает ваш код в случае, когда первый элемент также появляется позже в списке? Вы уверены?

...