我正在寻找一种算法来计算pow()
尾递归并使用记忆来加速重复计算。
性能不是问题;这主要是一项智力练习——我花了一趟火车,pow()
想出了我能想到的所有不同的实现,但无法想出一个我满意的具有这两个属性的实现。
我最好的镜头如下:
def calc_tailrec_mem(base, exp, cache_line={}, acc=1, ctr=0):
if exp == 0:
return 1
elif exp == 1:
return acc * base
elif exp in cache_line:
val = acc * cache_line[exp]
cache_line[exp + ctr] = val
return val
else:
cache_line[ctr] = acc
return calc_tailrec_mem(base, exp-1, cache_line, acc * base, ctr + 1)
它可以工作,但它不会记住所有计算的结果 - 只有那些具有指数1..exp/2
和exp
.