В вашем коде есть пара ошибок.
(> 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