【发布时间】:2021-08-31 09:21:23
【问题描述】:
当分而治之的递归函数产生的运行时间不够低时,还可以进行哪些其他改进?
比如说,这个power函数取自here:
def power(x, y):
if (y == 0): return 1
elif (int(y % 2) == 0):
return (power(x, int(y / 2)) * power(x, int(y / 2)))
else:
return (x * power(x, int(y / 2)) * power(x, int(y / 2)))
由于它是递归性质,memoizing and tail recursion(不确定它是否可以与分而治之一起应用)可以提供很大帮助,但我不知道有任何其他调整。对于我的基准测试,我使用的是:
base = 1522605027922533360535618378132637429718068114961380688657908494580122963258952897654000350692006139
exponent = 1000000
以301.140625s 结束,我仍然需要它能够处理更大的基数和指数...也许将问题分成两个以上的子问题?
正在使用的memoizer可以在here找到
【问题讨论】:
-
你有使用递归还是使用迭代方法也可以吗?
-
@QuentinCoumes 都很好,尽管我对改进分而治之很感兴趣。我的意思是,改进递归函数。
-
简单的改进是将多次调用
power(x, int(y / 2))替换为使用变量的唯一调用(即使 memoization 对此有所帮助),您也可以考虑使用位移来代替除法和模数。但不要忘记,纯 Python 并不是真正为计算密集型任务而设计的。
标签: python recursion divide-and-conquer