我正在尝试编写一个小程序来递归计算指数,我有点卡住了。这是一个家庭作业,我们被要求有一个基本案例,当指数是奇数时,指数是偶数。到目前为止,我有这个:
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 :(得分:4)
假设我们正在评估quick_power(1234, 2)
。评估结果如下:
quick_power(1234, 2)
quick_power(quick_power(1234, 1), 2)
quick_power(1234 * quick_power(1234, 0), 2)
quick_power(1234 * 1, 2)
quick_power(1234, 2)
...正如您所看到的,它最终开始评估我们开始的位置,因此您最终会得到无限递归。在没有给你解决方案的情况下,我建议你思考:如果我们有一个常数指数(这里,2),你有没有办法计算它而不必递归?
答案 1 :(得分: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)
答案 2 :(得分:0)
扩展上述内容:
一个递归算法有递归情况和基本情况(返回一个明确的结果而不是另一个递归),你可能知道......
对于这种情况,您涵盖了基本情况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)递归),最后一行应该更有效。