2017-06-03 49 views
4
def recursion(x): 
    if x == 0: 
     return 0 
    else: 
     return x << 1 + recursion(x - 1) 

print(recursion(3)) # 393216 


print(3 << 1) # 6 
print(2 << 1) # 4 
print(1 << 1) # 2 

以我头递归函数的输出应为:12 (6 + 4 + 2) 为什么这不是这样的?我必须说“393216”比我预期的数字“12”稍大。递归函数(比特移位)

我的期望:

--> return 1<<1==2 for 1 
--> return 2<<1==4 for 2 
--> return 3<<1==6 for 3 
0 --> return 0 for 0 

所有共同= 12

回答

8

的原因是由于运算符优先级。 Bitshift运算符的优先级低于算术。

默认情况下,x << 1 + recursion(x - 1)假定为x << (1 + recursion(x - 1))

您可以通过使用括号覆盖默认优先级来解决问题。

def recursion(x): 
    if x == 0: 
     return 0 
    else: 
     return (x << 1) + recursion(x - 1) 

print(recursion(3)) # 12 
4

运算符优先级。位移优先级低于加/减(see in docs)。因此,你需要

def recursion(x): 
    if x == 0: 
     return 0 
    else: 
     return (x << 1) + recursion(x - 1) 

按照目前的功能被解释相当于

def recursion(x): 
    if x == 0: 
     return 0 
    else: 
     return x << (1 + recursion(x - 1)) 
+0

快速修正,bitshifts具有较低的优先级,而不是更强。 –

+0

@Shiva哎呀,错字是,固定谢谢。 – miradulo