最近我一直在解決谷歌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
是一個整數S,它返回最大n
使得R(n) = S
的底數爲10的字符串表示。如果沒有這樣的n,則返回「無」。另外,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"
我不知道如果我需要解決的遞推關係到任何東西簡單,但因爲有一個甚至一個用於奇數,我覺得很難做到(我還沒有在學校中瞭解到它,所以我對這個主題的所有知識都來自互聯網文章)。
所以,在所有指導我完成這個挑戰任何幫助將受到歡迎:)
我認爲你必須知道一些先進的數學和使用快速矩陣求冪。 – 2014-12-04 19:49:41
這可能有助於:http://stackoverflow.com/questions/1988804/what-is-memoization-and-how-can-i-use-it-in-python – 2014-12-04 21:14:39
@LambdaFairy也許就是這樣吧!我認爲這不會有太大的區別,但事實證明,這要比以前快得多!謝謝!我現在試着用它來實現它,我會告訴你它是否做到了這一點:D – 2014-12-04 22:12:27