2013-06-28 35 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永远不会被满足导致堆栈溢出(因为递归太深)。

相关问题