【问题标题】:Counting unique elements in Scheme计算 Scheme 中的唯一元素
【发布时间】:2011-03-07 23:21:59
【问题描述】:

编写一个递归Scheme过程count-dist elements,它接受一个包含重复元素的列表并返回列表中不同元素的数量。

这是我的代码,但它不能正常工作。请帮忙!谢谢!!

(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))

【问题讨论】:

  • 我认为这与您的困难无关,但您的代码缩进并不完全正确。如果这反映了它的实际外观并且不仅仅是将其输入 Stack Overflow 时出现的故障,我是否强烈建议您养成总是小心缩进和间隔代码的习惯?这将使其更易于阅读(对您自己和他人而言),并使一些错误更难以被注意到。

标签: count scheme unique element distinct


【解决方案1】:

看起来你已经很接近了。

  • 向函数传递一个包含一个元素的列表时会发生什么?在这种情况下,您的函数应该返回什么?
  • 如果包含相同元素的二元素列表(例如(5 5))呢?你的函数返回一个合理的值吗?

【讨论】:

  • 如果是一个元素,则计数为 1。如果是具有 2 个相同元素的列表,则计数也为 1。但是,如果我想在那里传递更长的列表。我在代码中还缺少什么?
  • @Melissa:您的分析是正确的,但是您的功能实际上并非如此。您将需要修复您的功能。
【解决方案2】:

首先:为什么在 (null? (cdr lis)) 案例中返回零?

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

【讨论】:

    【解决方案3】:
     (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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 2022-11-25
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多