循环序列任务

时间:2019-07-06 11:42:58

标签: python

给出递归关系 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)

您还可以如何解决此问题,以便在时间和内存方面达到最佳?

1 个答案:

答案 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之类的网站上,以便在找到解决方案后得到一些反馈:)。