【问题标题】:Recursive Exponentiation递归取幂
【发布时间】:2015-11-08 22:49:42
【问题描述】:

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

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

【问题讨论】:

  • 你为什么有那些偶数/奇数支票?
  • @Anand:问题是任务说应该有这些检查。也就是说,有一个很好的理由:这是exponentiation by squaring 的算法。

标签: python recursion exponentiation


【解决方案1】:

扩展上述内容:

您可能知道,递归算法具有递归案例和基本案例(返回确定的结果而不是另一个递归)...

对于这种情况,您涵盖了基本情况 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) 递归),最后一行应该更有效。

【讨论】:

  • 在最后一行,你真的应该计算递归的东西 once 然后平方;否则,您将执行两次递归,这将消除平方乘法的所有性能优势并减少为迭代乘法。
  • 你说得对,这减少了调用次数,同时保持相同的递归级别。
【解决方案2】:
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)

【讨论】:

  • 你能解释一下吗?
【解决方案3】:

假设我们正在评估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)

...如您所见,它最终会从我们开始的地方开始评估,因此您最终会得到无限递归。在不给你解决方案的情况下,我建议你思考:如果我们有一个常数指数(这里是 2),有没有一种方法可以计算它而不必递归地计算?

【讨论】:

  • 我想我已经找到了解决方案。我会在下面发帖
  • 有没有机会我可以快速和你聊天并问你几个问题?这个递归的东西真是让我头疼!
  • @Mikey:当然。我不完全确定 Stack Overflow Chat 应该如何工作,但这里有一个链接,也许它可以工作:chat.stackoverflow.com/rooms/87074/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2018-07-28
  • 2013-09-24
  • 2020-06-11
相关资源
最近更新 更多