递归函数(带位移)

时间:2017-06-03 20:42:56

标签: python bit-shift

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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))