编写一个递归的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))
答案 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