В функциональном программировании вы не устанавливаете локальную переменную / счетчик. Вы используете параметры или возвращаемые значения для передачи (и имени) данных. В этом случае вы можете использовать возвращаемое значение (если вы не хотите изменять количество параметров функции для добавления счетчика).
Так что каждый раз, когда pred
равен true
, вы возвращаете то, что получилиот рекурсивного вызова, увеличенного на 1
, или верните то, что вы получили как есть.
(define count-true
(lambda (pred? lower upper)
(if (or (> lower upper) (= lower upper))
0
(if (pred? lower)
(+ 1 (count-true pred? (+ lower 1) upper))
(count-true pred? (+ lower 1) upper)))))
Комментарии: я изменил pred
на pred?
, потому что это предикат, поэтому он делает код более читабельным. Вы также можете упростить этот код, чтобы сначала вызвать count-true
, а затем использовать if
, чтобы решить, что делать с возвращаемым значением. И первое if
с предложением or
также можно упростить с помощью >=
. «Маленький интриган» - отличная книга, если вы хотите научиться рекурсии со списками, числами и т. Д.