Как поясняется в названии, у меня есть очень фундаментальный вопрос программирования, который я еще не смог проверить. Фильтрация всех (чрезвычайно умных) "Чтобы понять рекурсию, вы должны сначала понять рекурсию". ответы из разных онлайн-потоков я до сих пор не совсем понял.
Понимая, что, столкнувшись с незнанием того, чего мы не знаем, мы склонны задавать неправильные вопросы или задавать правильные вопросы неправильно. Я разделю то, что я "думаю", мой вопрос в надежде, что кто-то с похожим взглядом может поделиться некоторыми знаниями, которые помогут включить рекурсивную лампочку для меня!
Вот функция (синтаксис написан в Swift):
func sumInts(a: Int, b: Int) -> Int {
if (a > b) {
return 0
} else {
return a + sumInts(a: a + 1, b: b)
}
}
Мы будем использовать 2 и 5 в качестве наших аргументов:
println(sumInts(a: 2, b: 5))
Очевидно, что ответ равен 14. Но я не знаю, как это достигается.
Это мои 2 зависания:
-
Функция вызывается рекурсивно до тех пор, пока не будет выполнено условие. Это условие → b. Когда это условие выполнено, верните 0. На первый взгляд я ожидаю, что возвращаемое значение будет 0, что явно неверно.
-
Распечатка значения 'a' на каждой итерации дает значение, которое я ожидаю: 2, 3, 4, 5 (в какой точке 5 + 1 > b, который отвечает первому условию: a > b), но я до сих пор не вижу, как достигается значение 14.
Моя первая мысль заключается в том, что что-то похожее на следующее происходит магически:
var answer = a;
answer += a+1 until a > b;
return answer;
Итак, изгоняя магию, я просто ничего не получаю. Я хотел бы понять, что происходит больше, чем просто неявно.
Если кто-то может любезно объяснить, что технически происходит во время такого рода функций, и почему результат не равен 0, и как, в конце концов, a + sumInts(a: a + 1, b: b) = 14
, я всегда буду в долгу.