我尝试计算列表中的正元素数量。以下是我到目前为止的情况:
(define howMany
(lambda (list)
(cond
[(not (list? list)) 0]
[(null? list) 0]
[(> list 0) (+ 1 (howMany (cdr list)))])))
它一直给我一个错误,“期望类型实数”,你会如何解决这个问题?
哦,我这样称呼它:
(howMany '(6 7 8))
答案 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)))))