2015-08-16 90 views
2

我想寫一個遞歸計算指數的小程序,我有點卡住了。這是一項家庭作業,我們被要求有一個基本案例,當指數是一個奇數,當指數是偶數時。到目前爲止,我有這個:遞歸求冪

def quick_power(x,n): 
    if n == 0: 
     return 1 
    elif n % 2 != 0: 
     return x * quick_power(x, n-1) 
    elif n % 2 == 0: 
     return quick_power(quick_power(x, n//2), 2) 

而且我知道n%2 == 0的行不是它應該是。任何幫助表示讚賞。謝謝。

+0

爲什麼你有那些偶數/奇數的支票? –

+0

@Anand:這個問題說這個任務說應該有這些檢查。也就是說,有一個很好的理由:這是[平方指數]的算法(https://en.wikipedia.org/wiki/Exponentiation_by_squaring)。 – icktoofay

回答

4

假設我們正在評估quick_power(1234, 2)。評價是這樣的:

  1. quick_power(1234, 2)
  2. quick_power(quick_power(1234, 1), 2)
  3. quick_power(1234 * quick_power(1234, 0), 2)
  4. quick_power(1234 * 1, 2)
  5. quick_power(1234, 2)

...你可以看到,它最終開始評估回到了起點,所以你最終得到無限遞歸。在沒有給你解決方案的情況下,我建議你思考一下:如果我們有一個常量指數(這裏是2),你有沒有一種方法可以計算出來,而不必遞歸呢?

+0

我想我找到了解決方案。我會在 – Mikey

+0

以下發帖有沒有任何機會可以快速跳入與你的聊天並請問你幾個問題?這種遞歸的事情真的傷了我的頭! – Mikey

+0

@Mikey:當然。我不完全確定堆棧溢出聊天應該如何工作,但這裏有一個鏈接,也許它的工作原理:https://chat.stackoverflow.com/rooms/87074/discussion-on-question-32031093 – icktoofay

0
def quick_power(x,n) 

if n == 0: 
    return 1 
elif n % 2 == 0: 
    return quick_power(x * x, n/2) 
else: 
    return x * quick_power(x * x, (n - 1)/2) 
+0

你能解釋一下嗎?一點點? – Will

0

擴展在什麼上面:

遞歸算法遞歸情況下ANS基地例(其中返回一個明確的結果,而不是另一種遞歸的),你可能知道......

對於在這種情況下,您涵蓋了基本情況n = 0和n = 1。但是從@ icktoofay的回覆中,還有另一個基本案例,n = 2。

所以,你的代碼可以寫成:

def quick_power(x,n): 
    if n == 0: 
     return 1 
    elif n == 1: 
     return x 
    elif n == 2: 
     return x * x 
    elif n % 2 != 0: 
     return x * quick_power(x, n-1) 
    elif n % 2 == 0: 
     return quick_power(x,n//2) * quick_power(x,n//2) 

最後一行應該是通過減少遞歸的最大深度(到log2(n)的遞歸),順便更有效。

+0

在最後一行,你真的應該計算遞歸事物*一次*然後平方;否則,你會執行兩次遞歸,這會拋出平方和乘法的所有性能優點,並減少到迭代乘法。 – icktoofay

+0

實際上,你可以在保持相同遞歸級別的同時減少呼叫次數。 – rask004