【问题标题】:python recursion (exponential)python递归(指数)
【发布时间】:2018-01-23 17:29:24
【问题描述】:

快速求幂,我需要写一个算法,计算 n^b 的速度比 n 次乘法还快!算法的复杂度为 O(logn)。 我有一个代码,我能够通过前 20 次测试(我看不到数字),但我无法改进算法以通过最后 5 次测试。有什么建议可以改进吗?

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)


x = int(input())
n = int(input())
print(quick_power(x, n))

【问题讨论】:

  • 您正在重新计算大量冗余产品。为什么不使用表格来记忆你的函数呢?
  • 这是一道作业题?
  • 另外,如果您正在执行地板除法,您可以执行位移,它会快很多。 n >> 1
  • 顺便说一句,为什么不返回x ** n,它实际上在python中更快,因为它是用C实现的。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我试过 x**n,但无法“通过”测试

标签: python recursion


【解决方案1】:

你的想法是正确的,你的代码原则上没有错。关键是你需要区分两种状态,偶数和奇数

if n is even: x^n = (x^(n/2))^2
if n is odd: x^n = x*x^(n-1)

,你确实做到了。

如果不知道您最近的 5 次测试,很难弄清楚它失败的原因。不过你可以试试下面的简化代码。

def quick_power(x, n):
  if n == 0:
    return 1
  elif n % 2 == 0:
    return quick_power(x, n / 2)**2
  else:
    return x * quick_power(x, n-1)

print(quick_power(3, 5))

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2016-05-10
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    相关资源
    最近更新 更多