循环的迭代

时间:2017-01-25 16:40:20

标签: python algorithm performance recursion

函数f由

规则定义

enter image description here

编写一个函数 f(n),通过迭代过程计算f

我写了这个。并且仍然没有做对。请告知如何解决它。

def f(n):
    if (n<3):
        return n
    else:
        for x in range (n):
            a = f(n-1) + 2*f(n-2) + 3*f(n-3)
            return (a)

2 个答案:

答案 0 :(得分:6)

只需使用内存缓存:

def f(n):
    if n < 3:
        return n
    a,b,c = 0,1,2
    for i in range(n-2):
        a,b,c = b,c,c+2*b+3*a
    return c

在此功能中,我们使用a来表示 f(n-3)b来表示 f(n-2) f(n-1)c,在每个迭代步骤,我们计算 f(n),因此我们转移:a变为{ {1}},b变为bc获取新值。我们这样做,直到达到请求的c

所以最初我们将计算 f(3)。在这种情况下,n f(0)= 0 a f(1)= 1 b f(2)= 2 。现在,在迭代之后,c需要 f(1)= 1 a需要 f(2)= 2 和{{1}取 f(3)= f(2)+ 2×f(1)+ 3×f(0)= 5 ,你一直这样做,直到b有权{ {1}}。

这会更快,因为在递归变体中,您需要cc,但n会在途中调用f(n-2),从而引入重复的工作。

答案 1 :(得分:0)

如果您希望函数返回第一个n元素,则可以使用带有O(n)空格和时间的memoization的简单动态编程:

def F(n):
    f = [0]*n
    f[:4] = range(4)  
    for i in range(4, n):
        f[i] = f[i-1] + f[i-2] + f[i-3]
    return f    

print F(20) 
# [0, 1, 2, 3, 6, 11, 20, 37, 68, 125, 230, 423, 778, 1431, 2632, 4841, 8904, 16377, 30122, 55403]