Возможно, следующее поможет вам понять. Компьютер не заботится о том, называет ли он ту же самую функцию, что он просто вычисляет. Нет ничего волшебного в рекурсии, как только вы поймете, что это такое, и почему он работает со многими вещами, такими как списки, натуральные числа и т. Д., Которые сами по себе рекурсивные по структуре.
- Определение: факториал 0 равен 1
- Определение: факториал числа п больше 0 является продуктом этого числа и факториал его предшественника.
Следовательно
5! = 5*4! = 5*4*3! = 5*4*3*2! = 5*4*3*2*1! = 5*4*3*2*1*0! = 5*4*3*2*1*1 = 120
Итак, если вы когда-нибудь слышали доказательства по индукции, это выглядит следующим образом:
- Мы доказательства некоторые свойства для базового случая.
- Докажем, что если свойство истинно для n, то оно будет верно для преемника n.
- Мы заключаем, что это доказательство того, что свойство выполняется для базового случая и всех последовательных случаев.
Пример: Доказательство по индукции, что квадрат четного числа является кратным 4!
- Квадрат 0 равен 0, и это кратно 4.
- Пусть п четное число, квадрат которого N² кратно 4. Тогда
(2+n)*(2+n)
= 4+2n+2n+n²
. Это мультипликатор из 4, так как n² по нашему предположению, 4 равно 1 и 2n+2n = 4n
также кратно 4, а сумма кратных 4 кратно 4 по закону распределения: 4a + 4b = 4(a+b)
- Q.E.D. Свойство имеет место для 0 (наш базовый случай) и для (2 + n), если оно выполнено для n. Следовательно, оно выполняется для 2, 4, 6, 8 .... и всех других четных чисел.
(Более легкое доказательство того, что (2a)²
= 4*a*a
, что кратно 4.)
Написание рекурсивной программы очень похоже на делать доказательство по индукции:
- Записает вычисление для базового случая.
- Для не базового случая, мы знаем, как мы можем вычислить результат (например, мы знаем, что
n! = n * (n-1)!
, поэтому мы написать это только вниз, так как функция Нам нужна одна, мы просто писать!
- Мы можем заключить, что наша программа будет вычислять правильное значение для базового случая и любого преемника базового случая. Если
678!
все же не вычисляет правильный ответ, то это связано с тем, что мы использовали тип данных, такой как int
что не подходит для больших чисел (или, если сказать, по-другому, вычисляет все moulo 2^32) и, кроме того, с программным обеспечением, которое настаивает на интерпретации половины доступных чисел как отрицательных.
Причина, по которой это работает, не имеет ничего общего с компьютерным оборудованием или языком программирования: оно, как я уже говорил, является следствием рекурсивной структуры элементов (списков, деревьев, множеств, натуральных чисел) под рукой ,
Обычная ошибка, которую совершают новички, заключается в том, чтобы игнорировать базовый корпус и потеряться по сложности. Я всегда предлагаю начать с базового случая, как только у вас есть это, вы можете предположить, что функция существует и может просто использовать ее в более сложных случаях.
* «Почему рекурсия функционирует так?» * Потому что это то, что вы сказали ей делать? Это простой пошаговый подход, продиктованный кодом? Вызовите функцию, дождитесь ее результата. Прополощите, повторите. –
Взгляните на [этот ответ на другие вопросы по рекурсии] (http://stackoverflow.com/a/5312096/1448212) –
Но что это такое, что рекурсия вычисляется таким образом? – vladdy