计算Scheme中的唯一元素

时间:2011-03-07 23:21:59

标签: count scheme unique element distinct

编写一个递归的Scheme过程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 个答案:

答案 0 :(得分:1)

看起来你已经非常接近了。

  • 当您将函数传递给包含一个元素的列表时会发生什么?在这种情况下,你的函数应该返回什么?
  • 具有相同元素的双元素列表(例如(5 5))怎么样?你的功能是否会带来合理的价值?

答案 1 :(得分:0)

首先:为什么你在(null? (cdr lis))案件中归零?

第二:在第一个元素也出现在列表后面的情况下,您认为您的代码会返回什么?你确定吗?

答案 2 :(得分:0)

 (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