以下代码计算结果(x * k -y)n次的总和,值k从1开始,每次循环运行时递增1:
def invoke(n,x,y):
k=1
sum1=0
while(n > 0):
result=x*k-y
k+=1
sum1+= result
n-=1
return sum1
例如,使用值调用函数,调用(2,3,5)将输出-1,因为对于k = 1,它是3 * 1-5 = -2,对于k = 2,它变为3 * 2-5 = 1。因此,程序返回-1,因为-2和1都被添加。
我遇到的问题是计算大数字需要一段时间,有没有办法优化这个?
为了让它运行得更快,我写了一个这个程序的递归实现:
def invoke1(n,x,y):
k=0
if n == 0:
return 0
else:
return x*(k+n)-y + invoke1(n-1,x,y)
然而,这个实现并没有好多,因为我在计算大数时遇到错误。
答案 0 :(得分:6)
不应该寻找一种更快地完成同样工作的方法,而应该问你是否必须首先完成所有的工作。
基本上你想要计算:
n
---
\
/ x * k - y
---
k=1
修复x
和y
。如果我们对它进行数学分析,我们知道这相当于:
n * (n+1) * x
------------- - n * y
2
所以我们可以把它计算为:
def invoke(n, x, y):
return n * (n+1) * x / 2 - n * y
或如果我们只在整数域中执行计算:
def invoke_ints(n, x, y):
return n * (n+1) * x // 2 - n * y
鉴于计算是在恒定时间内完成的(如果数字非常大,实际计算通常在 O(log n)中完成),时间复杂度是恒定的,如果不是,这些是在 O(log n)。
迭代和递归函数都在 O(n)中工作(如果计算是在恒定时间内),或者 O(n log n)以防数字是那么庞大,我们用任意位长度进行计算。递归通常会减慢进程,因为Python中的函数调用非常昂贵,并且Python没有实现尾调用优化(TCO)。