我正在尝试计算列表中的正元素数以下是我目前掌握的情况:

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

它总是给我一个错误,“期望输入实数”,你会如何解决这个问题?
哦,我这样称呼:
(howMany '(6 7 8))

最佳答案

你的代码中有几个错误。
(> list 0)应该是(> (car list) 0)因为您要检查列表的第一个元素是否大于0您也不能将默认的>实现应用于列表。
(+ 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)))))

测试:
> (howmany '(1 2 3 4 5))
5
> (howmany '(1 2 3 -4 5))
4
> (howmany '(1 -2 3 -4 5))
3
> (howmany '(-1 -2 3 -4 5))
2

10-02 22:21