计算列表中的积极元素

时间:2010-11-11 20:16:52

标签: functional-programming lisp scheme

我尝试计算列表中的正元素数量。以下是我到目前为止的情况:

 (define howMany
   (lambda (list)
      (cond
         [(not (list? list)) 0]
         [(null? list) 0]
         [(> list 0) (+ 1 (howMany (cdr list)))])))

它一直给我一个错误,“期望类型实数”,你会如何解决这个问题?

哦,我这样称呼它:

(howMany '(6 7 8))

4 个答案:

答案 0 :(得分:4)

您不能指望(> list 0)工作 - list是一个列表,但>期望其参数为数字。

您想查看列表中的第一个元素是否为正数,因此应为(> (car list) 0)

然而:您的代码存在更大的问题:如果第一个元素为负数或零,会发生什么?

答案 1 :(得分:0)

以下是您的问题:(> list 0)

您将列表与数字进行比较。试试(> (length list) 0)(not (null? list))。或者“cond块中的默认条件”的Scheme关键字是。

编辑:当您专注于错误消息时,这就是您所获得的。当然,加雷斯是对的。

答案 2 :(得分:0)

positiveCounter(seq)
  if typeof(first(seq)) == num
      if first(seq) > 0
          return positiveCounter(rest(seq) + 1
      else
          return positiveCounter(rest(seq)
  else
      #Handle Errors Somehow. 

我将使用的递归算法的伪代码。

我不知道Scheme或Clojure(你的方括号让我想起)。

或者你可以在Common Lisp中编写一个相当流畅的应用方法 - 可读性的额外换行符。

(defun positiveCounter (seq)
  (reduce #'+
          (mapcar
           #'(lambda (x)
               (if (atom x)
                   (if (> x 0) 1 0)
                   0))
           seq)))

答案 3 :(得分:0)

您的代码中存在一些错误。

(> list 0)应为(> (car list) 0),因为您要检查列表的第一个元素是否大于0.您无法应用{{1}的默认实现列表也是。

>也会失败,因为(+ 1 (howMany (cdr list)))并不总是评估为数字。您必须通过将其作为参数传递给递归调用的过程来维护计数器。一种方法是:

howMany

测试:

(define (howmany lst)
  (let loop ((n 0) (lst lst))
    (if (null? lst) n
      (loop (if (> (car lst) 0) (add1 n) n) (cdr lst)))))