Нет, я думаю, вы правы и рекурсивны. Вроде бы вариация Fibonacci Sequence, классическая рекурсивная проблема
Помните, что рекурсивный алгоритм имеет 2-х частей:
- Базовый вариант
- Рекурсивный вызов
База case указывает точку, в которой вы больше не можете переписывать. Например, если вы сортируете рекурсивно, базовый регистр представляет собой список длины 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
. Это означает, что для наших pruposes, 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
будет печатать последовательность.
кажется оффтоп мне ... Не понимая, что такое «функция вызова одного аргумента со значением x», трудно решать задачи программирования. Вы попросили написать почти калькулятор «Фибоначчи номер» - посмотрите его ... –