我试图通过递归来实现幂函数。 但我得到了运行时错误,如超出最大递归深度。 我将不胜感激! 这是我的代码。
def fast_power(a,n):
if(n==0):
return 1
else:
if(n%2==0):
return fast_power(fast_power(a,n/2),2)
else:
return fast_power(fast_power(a,n/2),2)*a
答案 0 :(得分:2)
您应该使用n // 2
代替n / 2
:
>>> 5 // 2
2
>>> 5 / 2
2.5
(至少在python3中)
问题是,一旦你最终得到花车,你需要花一点时间才能在0
结束2
之前:
>>> from itertools import count
>>> n = 5
>>> for i in count():
... n /= 2
... if n == 0:
... break
...
>>> i
1076
因此,您可以看到,您需要超过1000次递归调用才能从0
到达5
,并且这超出了默认的递归限制。此外:该算法应使用整数运行。
这说我将这个功能写成:
def fast_power(a, n):
if n == 0:
return 1
tmp = fast_power(a, n//2)
tmp *= tmp
return a*tmp if n%2 else tmp
产生:
>>> fast_power(2, 7)
128
>>> fast_power(3, 7)
2187
>>> fast_power(13, 793)
22755080661651301134628922146701289018723006552429644877562239367125245900453849234455323305726135714456994505688015462580473825073733493280791059868764599730367896428134533515091867511617127882942739592792838327544860344501784014930389049910558877662640122357152582905314163703803827192606896583114428235695115603966134132126414026659477774724471137498587452807465366378927445362356200526278861707511302663034996964296170951925219431414726359869227380059895627848341129113432175217372073248096983111394024987891966713095153672274972773169033889294808595643958156933979639791684384157282173718024930353085371267915606772545626201802945545406048262062221518066352534122215300640672237064641040065334712571485001684857748001990405649808379706945473443683240715198330842716984731885709953720968428395490414067791229792734370523603401019458798402338043728152982948501103056283713360751853
答案 1 :(得分:0)
我相信@ Bakuriu对这个问题的解释是不完整的。不是他的重新实现,而是他对你的bug的解释。您可以通过在原始代码中将/
替换为//
来说服自己,并尝试:
fast_power(2, 2)
它仍然超过了堆栈。尝试将堆栈扩展十倍:
sys.setrecursionlimit(10000)
它仍然超过了堆栈。原因是你也有一个infinte循环:
if (n % 2 == 0):
return fast_power(..., 2)
由于2%2 == 0,这只是永远地递归。添加另一个基本案例:
if n == 2:
return a * a
解决了这个问题。一个完整的解决方案:
def fast_power(a, n):
if n == 0:
return 1
# if n == 1:
# return a
if n == 2:
return a * a
if n % 2 == 0:
return fast_power(fast_power(a, n // 2), 2)
return a * fast_power(fast_power(a, n // 2), 2)