Нет, я думаю, вы правы, и это рекурсивно. Похоже, это разновидность последовательности Фибоначчи, классической рекурсивной задачи.
Помните, что рекурсивный алгоритм состоит из двух частей:
- Базовый случай
- Рекурсивный вызов
Базовый случай указывает точку, в которой вы больше не можете рекурсировать. Например, если вы сортируете рекурсивно, базовым случаем является список длиной 1 (поскольку один элемент сортируется тривиально).
Итак (при условии, что n не является отрицательным), у вас есть 2 базовых случая: n = 0 и n = 1. Если ваша функция получает значение n, равное 0 или 1, то рекурсия больше не имеет смысла.
Имея это в виду, ваш код должен выглядеть примерно так:
function f(int n):
#check for base case
#if not the base case, perform recursion
Итак, давайте использовать Фибоначчи в качестве примера.
В последовательности Фибоначчи каждое число равно сумме двух предшествующих ему чисел. Итак, учитывая последовательность 1, 2
, следующее число, очевидно, будет 1 + 2 = 3
, а число после него — 2 + 3 = 5
, 3 + 5 = 8
и так далее. В общем случае n-е число Фибоначчи — это (n-1)-е число Фибоначчи плюс (n-2)-е число Фибоначчи, или f(n) = f(n - 1) + f(n - 2)
.
Но с чего начинается последовательность? Это то место, где появляется базовый случай. Фибоначчи определил свою последовательность как начинающуюся с 1, 1
. Это означает, что для наших целей f(0) = f(1) = 1
. Так...
function fibonacci(int n):
if n == 0 or n == 1:
#for any n less than 2
return 1
elif n >= 2:
#for any n 2 or greater
return fibonacci(n-1) + fibonacci(n-2)
else:
#this must n < 0
#throw some error
Обратите внимание, что одна из причин, по которой Фибоначчи преподается вместе с рекурсией, заключается в том, что она показывает, что иногда рекурсия — плохая идея. Я не буду вдаваться в подробности, но для больших n этот рекурсивный подход очень неэффективен. В качестве альтернативы можно использовать 2 глобальные переменные, n1
и n2
, чтобы...
n1 = 1
n2 = 1
print n1
print n2
loop:
n = n1 + n2
n2 = n1
n1 = n
print n
напечатает последовательность.
person
acattle
schedule
05.06.2012