递归指数

时间:2015-08-16 01:40:50

标签: python recursion exponentiation

我正在尝试编写一个小程序来递归计算指数,我有点卡住了。这是一个家庭作业,我们被要求有一个基本案例,当指数是奇数时,指数是偶数。到目前为止,我有这个:

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的行不是应该的。任何帮助表示赞赏。感谢。

3 个答案:

答案 0 :(得分:4)

假设我们正在评估quick_power(1234, 2)。评估结果如下:

  1. quick_power(1234, 2)
  2. quick_power(quick_power(1234, 1), 2)
  3. quick_power(1234 * quick_power(1234, 0), 2)
  4. quick_power(1234 * 1, 2)
  5. quick_power(1234, 2)
  6. ...正如您所看到的,它最终开始评估我们开始的位置,因此您最终会得到无限递归。在没有给你解决方案的情况下,我建议你思考:如果我们有一个常数指数(这里,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)递归),最后一行应该更有效。