Это просто, если вы визуализируете каждую итерацию в цикле как вызов функции. Подумайте об этом: исходный цикл for
идет от 1
до . Это то же самое, что начиная с limit-1
, уменьшая предел на 1
при каждом вызове функции и останавливаясь, когда мы достигнем 0
.
Есть две важные вещи, чтобы помнить вэнь писать рекурсивную процедуру:
- Мы должны убедиться, что мы останавливаемся в какой-то момент - это называется базовый случай; для этого примера это происходит, когда мы достигаем
0
(потому что исходный цикл включает 1
).
- Мы должны объединить частичные результаты, которые мы получим вместе при вызове рекурсии: если текущее число случается делится на
3
или 5
затем добавить его к остальной части рекурсивных вызовов, в противном случае мы будем игнорировать его, но продолжайте продвигать рекурсию в любом случае, пока не достигнете базового варианта.
Это то, что я имею в виду:
(define (sum-divisibles limit)
(cond ((= limit 0) 0) ; base case, stop recursion
((or (divides? limit 3) (divides? limit 5)) ; does the condition hold?
(+ limit ; then we add current value
(sum-divisibles (- limit 1)))) ; and advance the recursion
(else ; otherwise skip it
(sum-divisibles (- limit 1))))) ; and advance the recursion
Будьте осторожны с начальным limit
значение, помните, что в исходном коде limit
не добавляется к сумме (итерация останавливается прямо перед достижением он), следовательно, эквивалентный способ вызова рекурсивный вариант заключается в следующем:
(sum-divisibles (- n 1))
Например, чтобы получить такое же значение, как (sum-divisibles 50)
с вашим кодом, мы должны называть его, как это в рекурсивной версии:
(sum-divisibles 49)
=> 543
В качестве альтернативы вы можете написать процедуру помощника, которая заботится о снижении ввода limit
один перед вызовом фактической рекурсивной процедуры, но это оставил упражнение для читателя.
@DataPoliceInc. Этот или любой другой ответ решал ваш вопрос? если это так, пожалуйста, не забудьте принять и/или поддержать лучшие ответы, поощрять плакаты;) –
Привет, Оскар. спасибо вам за объяснение. Теперь мне это очень ясно, и я все понимаю. Теперь я пытаюсь создать вспомогательную функцию для (N-1) случая, о которой вы сказали. – DataPsycho