В последнее время я решал некоторые проблемы из Google Foobar для удовольствия, и теперь я застрял в одном из них более 4 дней. Речь идет о рекурсивной функции определяются следующим образом:Решая рекурсивную последовательность
R(0) = 1
R(1) = 1
R(2) = 2
R(2n) = R(n) + R(n + 1) + n (for n > 1)
R(2n + 1) = R(n - 1) + R(n) + 1 (for n >= 1)
Задача состоит в написании функции answer(str_S)
, где str_S
является основанием 10 строковое представление целого числа S, который возвращает наибольшее n
таким образом, что R(n) = S
. Если такого n нет, верните «None». Кроме того, S будет положительным целым числом не более 10^25.
Я много исследовал рекурсивные функции и о решении рекуррентных отношений, но не повезло. Я вывел первые 500 номеров, и я не нашел никакого отношения к каждому из них. Я использовал следующий код, который использует рекурсию, поэтому он становится очень медленным, когда числа начинают становиться большими.
def getNumberOfZombits(time):
if time == 0 or time == 1:
return 1
elif time == 2:
return 2
else:
if time % 2 == 0:
newTime = time/2
return getNumberOfZombits(newTime) + getNumberOfZombits(newTime+1) + newTime
else:
newTime = time/2 # integer, so rounds down
return getNumberOfZombits(newTime-1) + getNumberOfZombits(newTime) + 1
Задача также некоторые тестовые случаи так, вот они:
Test cases
==========
Inputs:
(string) str_S = "7"
Output:
(string) "4"
Inputs:
(string) str_S = "100"
Output:
(string) "None"
Я не знаю, если мне нужно решить рекуррентное соотношение к чему-либо более простым, но есть один для даже и один для нечетных чисел, мне очень сложно это сделать (я еще не узнал об этом в школе, поэтому все, что я знаю об этом, - это интернет-статьи).
Таким образом, любая помощь на всех ведя меня, чтобы закончить этот вызов будет приветствоваться :)
Я думаю, вам нужно знать некоторые передовые математики и использовать быстрое экспоненциальное представление матрицы. –
Это может помочь: http://stackoverflow.com/questions/1988804/what-is-memoization-and-how-can-i-use-it-in-python –
@LambdaFairy, возможно, это он! Я думал, что это не будет иметь большого значения, но оказалось, что это намного, намного быстрее, чем раньше! Благодаря! Я попытаюсь реализовать его с этим сейчас, я скажу вам, сделал ли это трюк: D –