2013-06-28 32 views
0

該代碼使用位操作添加2個數字。爲什麼我的python add函數不適用於某些整數組合?

def add(a,b): 
    if b == 0: 
     return a 
    sum = a^b 
    carry = (a & b) << 1 
    return add(sum, carry) 

這將導致堆棧溢出與

插件調用它(1,4)

感謝

+1

您是否嘗試過使用調試器?每次你遞歸調用'add()'時,'a'是一個更負數,'b'是更正數。由於Python中的整數在需要時會自動提升爲任意長度的整數,因此永遠不會停止執行。如果它沒有推廣到任意長度的整數,我認爲它會停止執行,就像你預期溢出一樣。 – Patashu

回答

4

這個遞歸永遠當爲負的原因是,在Python中,整數是任意的精度。這意味着一個負數有效地在其前面有無限多個1位,並且它永遠不會溢出。因此,你的算法會永遠持續運行,因爲它永遠不會達到一個0位的位置。

+0

謝謝!有沒有解決這個問題? – ppone

+0

@ppoone'return a + b' – Antimony

1

發生這種情況是因爲負數是用前導零寫的,而不是前導零。特別是carry在每次迭代中變得更大(並且sum變得「負」變大)並且條件b == 0永遠不會被滿足導致堆棧溢出(因爲遞歸太深)。

相關問題