2011-03-07 71 views
2

编写递归方案过程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:让它成为(计数DIST元素 '(1 2 1 1 2 3 4 5 5 6 6 7 7 8 8 8 9))

+1

我不认为这有什么与你的困难,但你的代码是不是很正确缩进。如果这反映了它的实际外观,并且不仅仅是将它输入到Stack Overflow时出现的一个小问题,我强烈建议你养成* always *缩进的习惯并小心地分隔代码?这会让阅读变得更容易(对于你自己和他人),并且会犯一些更难以忽略的错误。 – 2011-03-07 23:29:20

回答

1

看起来你'重新接近。

  • 当您将函数传递给一个元素时会发生什么?在这种情况下,你的函数应该返回什么?
  • 那么具有相同元素的两元素列表(例如(5 5))呢?你的函数是否会返回一个合理的值?
+0

如果一个元素,那么计数将为1. 如果是具有2个相同元素的列表,则它也将为1。但是如果我想在那里传递一个更长的列表。我在代码中还缺少什么? – 2011-03-07 23:35:57

+1

@Melissa:你的分析是正确的,但是你的功能实际上并不是这样工作的。你将需要修复你的功能。 – 2011-03-07 23:42:00

0

第一:为什么你在(null? (cdr lis))的情况下归零?

第二:如果第一个元素也出现在列表后面,那么您认为您的代码返回了什么?你确定?

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