Functional programming 对列表中的正元素进行计数

Functional programming 对列表中的正元素进行计数,functional-programming,lisp,scheme,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))

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

 (define howMany
   (lambda (list)
      (cond
         [(not (list? list)) 0]
         [(null? list) 0]
         [(> list 0) (+ 1 (howMany (cdr list)))])))
它不断地给我一个错误,期望输入实数,你将如何解决这个问题

哦,我这样称呼它:

(howMany '(6 7 8))
这是您的问题:>列表0

你正在将一个列表与一个数字进行比较。尝试>长度列表0或不为空?列表或者cond块中默认条件的Scheme关键字是什么

编辑:这是您在关注错误消息时得到的结果。当然,加雷斯是对的。

这是你的问题:>列出0

你正在将一个列表与一个数字进行比较。尝试>长度列表0或不为空?列表或者cond块中默认条件的Scheme关键字是什么

编辑:这是您在关注错误消息时得到的结果。当然,Gareth是对的。

您不能期望>列表0起作用-列表是一个列表,但>期望其参数是数字

您希望查看列表的第一个元素是否为正,因此应该是>汽车列表0

但是:您的代码有一个更大的问题:如果第一个元素是负数或零,会发生什么情况?

您不能期望>列表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. 
您希望查看列表的第一个元素是否为正,因此应该是>汽车列表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. 
我将使用的递归算法的伪代码

我不知道你方括号里的哪个方案或Clojure让我想起了

或者,您可以用通用Lisp编写一个相当时髦的应用程序方法—额外的换行符以提高可读性

(defun positiveCounter (seq)
  (reduce #'+
          (mapcar
           #'(lambda (x)
               (if (atom x)
                   (if (> x 0) 1 0)
                   0))
           seq)))
我将使用的递归算法的伪代码

我不知道你方括号里的哪个方案或Clojure让我想起了

或者,您可以用通用Lisp编写一个相当时髦的应用程序方法—额外的换行符以提高可读性

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

您的代码中有几个bug

>列表0应为>汽车列表0,因为您要检查列表的第一个元素是否大于0。您也不能将>的默认实现应用于列表

+1“多少cdr列表”也将失败,因为“多少cdr列表”并不总是计算为一个数字。必须通过将计数器作为参数传递给递归调用的过程来维护计数器。一种方法是:

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


您的代码中有几个bug

>列表0应为>汽车列表0,因为您要检查列表的第一个元素是否大于0。您也不能将>的默认实现应用于列表

+1“多少cdr列表”也将失败,因为“多少cdr列表”并不总是计算为一个数字。必须通过将计数器作为参数传递给递归调用的过程来维护计数器。一种方法是:

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


当然,你指的是方案而不是模式?当然,你指的是方案而不是模式?你指的是t而不仅仅是t吗?是的,t。我更像是一个口齿不清的人,而不是一个阴谋家,我经常忘记这些细微的差别。我明白你的意思,如果第一个数字是零或负数,它不会起任何作用。如果列表如下所示:“12-3它崩溃并告诉我预期的类型编号。这是因为如果没有任何一个案例匹配,cond表达式的值将返回未指定的值,就像它在中所说的那样-可能事实上它返回f或。然后您尝试将1添加到该子句中,这是一个类型错误,因为+期望其参数为数字。如果没有任何子句匹配,则期望cond返回或其他合适的nothing实际上算是真的。你是说t而不仅仅是t吗?是的,t。我更像是一个口齿不清的人,而不是一个阴谋家,我经常忘记这些细微的差别。我明白你的意思,如果第一个数字是零或负数,它不会起任何作用。如果列表如下所示:“12-3它崩溃并告诉我预期的类型编号。这是因为如果没有任何一个案例匹配,cond表达式的值将返回未指定的值,就像它在中所说的那样-可能事实上它返回f或。然后您尝试将1添加到该子句中,这是一个类型错误,因为+期望其参数为数字。如果没有任何子句匹配,则期望cond返回或其他合适的nothing实际上算作true。Scheme在cond中没有默认条件的特殊关键字。当你想要一个默认条件时,你只需要给t scheme的关键字for true作为条件。啊,谢谢。我稍微涉猎了一下Common Lisp,所以Scheme对我来说像是一种外国方言。没有特殊的关键字-我认为Scheme的else子句比R6RS长很多。Scheme在默认条件下没有特殊的关键字。当你想要一个默认条件时,你只需要给t scheme的关键字for true作为条件。啊,谢谢。我稍微涉猎了一下CommonLisp,所以Scheme对我来说就像是一种外国方言。没有特殊的关键字-我认为Scheme的else子句中有很多其他内容
一些方案所允许的方括号纯粹是为了可读性——它们与parens是一样的。等效方案非常接近:定义正计数器seq apply+map lambda x if number?x如果>x 0 1 0 0seq@Chuck:如果和数字?x>x 0 1 0,当然?一些方案允许的方括号纯粹是为了可读性——它们与帕伦斯是一样的。等效方案非常接近:定义正计数器seq apply+map lambda x if number?x如果>x 0 1 0 0seq@Chuck:如果和数字?x>x 0 1 0,当然?