给出递归关系 f0 = 0,f1 = 1,f2 = 2 和 fk给出的序列 f0,f1,f2,... = f(k-1)+ f(k-3)
编写一个程序来计算此序列的n个元素,其编号为k1,k2,...,kn。
输入格式
输入的第一行包含整数n(1 <= n <= 1000) 第二行包含n个非负整数ki(0 <= ki <= 16000),以空格分隔。
输出格式
输出fk1,fk2,... fkn的以空格分隔的值。
内存限制:10MB
时间限制:1秒
问题在于大值的递归函数超出了限制。
def f (a):
if a <= 2:
return a
return f (a - 1) + f (a - 3)
n = int (input ())
nums = list (map (int, input (). split ()))
for i in range (len (nums)):
if i <len (nums) - 1:
print (f (nums [i]), end = '')
else:
print (f (nums [i]))
我也尝试通过一个周期解决问题,但是任务没有花费时间(1秒):
fk1 = 0
fk2 = 0
fk3 = 0
n = int (input ())
nums = list (map (int, input (). split ()))
a = []
for i in range (len (nums)):
itog = 0
for j in range (1, nums [i] + 1):
if j <= 2:
itog = j
else:
if j == 3:
itog = 0 + 2
fk1 = itog
fk2 = 2
fk3 = 1
else:
itog = fk1 + fk3
fk1, fk2, fk3 = itog, fk1, fk2
if i <len (nums) - 1:
print (itog, end = '')
else:
print (itog)
您还可以如何解决此问题,以便在时间和内存方面达到最佳?
答案 0 :(得分:0)
关于内存,最好的解决方案可能是迭代解决方案。我认为您离答案不远。想法是首先检查简单情况 f(k)= k (即 k <= 2 ),对于所有其他情况 k> 2 ,您可以简单地使用( fi-3,fi-2,fi-1 )计算 fi ,直到 i = k 。在此过程中,实际上您需要做的就是跟踪最后三个值(类似于您在fk1, fk2, fk3 = itog, fk1, fk2
行中所做的操作。)
另一方面,您需要在这里做一件事。如果您仅独立执行 fk1,fk2,... fkn 的计算,那么您将陷入困境(除非您使用超高速计算机或Cython实现)。另一方面,没有理由执行 n 个独立的计算,您只需为x = max(k1,k2,...,kn)和在您存储 fk1,fk2,...,fkn 的每个答案的方式上(这会稍微降低 fx 的计算速度,但不是这样做n次,您只会做一次)。这样,即使对于 n = 1000 ,也可以在1秒内解决。
在我的机器上, f15000,f15001,...,f16000 的独立计算大约需要30s,“一次全部”解决方案大约需要0.035s。
老实说,这并不是一件容易的事,将有趣的解决方案展示在code review之类的网站上,以便在找到解决方案后得到一些反馈:)。