Рекурсивная процедура со счетчиком? - PullRequest
1 голос
/ 24 октября 2019

Я должен написать рекурсивный алгоритм, который будет возвращать число целых чисел в интервале, для которого предикат "pred" верен.

Мне удалось написать рекурсивную часть, которая перемещается от нижней границы к верхней границе, но я не могу понять, как реализовать какой-то счетчик , который увеличивается на 1 каждыйвремя, которое предикат является истинным для целого числа, так как мой код рекурсивен (т.е. я продолжаю вызывать один и тот же метод). Если я создаю счетчик внутри метода, каждый раз, когда он вызывается, счетчик будет инициализироваться как 0.

То, что я написал до сих пор:

(define count-true
  (lambda (pred lower upper)
    (if (or (> lower upper) (= lower upper))
        (pred lower)
        (count-true pred (+ lower 1) upper))))

Исходный вопрос:

Напишите рекурсивную (не итеративную) процедуру (count-true pred lower upper) типа (number->boolean),number,number->number, которая возвращает число целых чисел в диапазоне lower..upper (включительно), для которых предикат pred применен к этому числуверно.

1 Ответ

3 голосов
/ 24 октября 2019

В функциональном программировании вы не устанавливаете локальную переменную / счетчик. Вы используете параметры или возвращаемые значения для передачи (и имени) данных. В этом случае вы можете использовать возвращаемое значение (если вы не хотите изменять количество параметров функции для добавления счетчика).

Так что каждый раз, когда 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 также можно упростить с помощью >=. «Маленький интриган» - отличная книга, если вы хотите научиться рекурсии со списками, числами и т. Д.

...