递归求幂

问题描述:

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

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

为什么你有那些偶数/奇数的支票? –

+0

@Anand:这个问题说这个任务说应该有这些检查。也就是说,有一个很好的理由:这是[平方指数]的算法(https://en.wikipedia.org/wiki/Exponentiation_by_squaring)。 – icktoofay

假设我们正在评估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),你有没有一种方法可以计算出来,而不必递归呢?

+0

我想我找到了解决方案。我会在 – Mikey

+0

以下发帖有没有任何机会可以快速跳入与你的聊天并请问你几个问题?这种递归的事情真的伤了我的头! – Mikey

+0

@Mikey:当然。我不完全确定堆栈溢出聊天应该如何工作,但这里有一个链接,也许它的工作原理:https://chat.stackoverflow.com/rooms/87074/discussion-on-question-32031093 – icktoofay

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) 
+0

你能解释一下吗?一点点? – Will

扩展在什么上面:

递归算法递归情况下ANS基地例(其中返回一个明确的结果,而不是另一种递归的),你可能知道......

对于在这种情况下,您涵盖了基本情况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)的递归),顺便更有效。

+0

在最后一行,你真的应该计算递归事物*一次*然后平方;否则,你会执行两次递归,这会抛出平方和乘法的所有性能优点,并减少到迭代乘法。 – icktoofay

+0

实际上,你可以在保持相同递归级别的同时减少呼叫次数。 – rask004