试图了解这种动态编程的python代码吗?

时间:2019-01-08 19:26:36

标签: python dynamic-programming fibonacci

因此,我正在阅读《动态编程》这本出色的intro,并尝试破译此python代码(斐波那契数字的DP方法)。我主要使用C / C#编写代码,因此我很难理解Python。 这是代码:

def fibonacciVal(n):
    memo = [0] * (n+1)
    memo[0], memo[1] = 0, 1
    for i in range(2, n+1):
        memo[i] = memo[i-1] + memo[i-2]
    return memo[n]

所以,我想了解的是:

  1. memo = [0] *(n + 1):我得到这是一个数组,但是值如何存储在这里,如何初始化?

  2. 对于范围在(2,n + 1)中的i ::为什么一直循环到n + 1,不是应该一直循环到n吗?

仅此而已。我试图自己解密,这将有助于有python经验的人在这里帮助我。

谢谢!

4 个答案:

答案 0 :(得分:1)

1: [0]*3 -> [0,0,0] i.e. multiplying an array duplicates it that many times -n+1 in your case-.
2: because you start with [0,1,0,0,0, ...]
 the first index you add to is ^

... the last index you add to will be at n+1 because the first index you added to was 2
[0,1,1,2,3,5,8,13,21,...]

答案 1 :(得分:0)

您使用哪些工具来“试图理解”?几个基本的print命令会有所帮助:

def fibonacciVal(n):
    memo = [0] * (n+1)
    print("INIT", memo)
    memo[0], memo[1] = 0, 1
    for i in range(2, n+1):
        memo[i] = memo[i-1] + memo[i-2]
        print("TRACE", i, memo)
    return memo[n]

fibonacciVal(5)

输出:

INIT [0, 0, 0, 0, 0, 0]
TRACE 2 [0, 1, 1, 0, 0, 0]
TRACE 3 [0, 1, 1, 2, 0, 0]
TRACE 4 [0, 1, 1, 2, 3, 0]
TRACE 5 [0, 1, 1, 2, 3, 5]

答案 2 :(得分:0)

  

memo = [0] * (n+1):我得到的是一个数组,但是值如何存储在这里,如何初始化?

在Python中将一个元素的列表乘以整数后,它将初始化一个列表,该列表中的元素重复指定的次数。例如,对于n=5

memo = [0] * (n+1)

将初始化一个包含6个0的列表,并将其分配给变量memo

>>> n = 5
>>> memo = [0] * (n+1)
>>> memo
[0, 0, 0, 0, 0, 0]

请注意,这种用于初始化列表的方法适用于不可变对象(布尔,数字,字符串等)的列表,但不适用于可变对象(例如列表或字典列表) 。这是因为Python将相同对象n副本添加到列表中,这通常不是您想要的。 (当您尝试更改列表中的一个可变对象时,它们都将更改,因为它们都是同一对象的副本。)


  

for i in range(2, n+1)::为什么循环到n + 1,不是只循环到n?

它确实在n处停止,因为这是range函数的内置行为。当您传入两个参数时,它们分别是其startstop的值。 range函数将从start(包括)到stop(不包括)返回序列。

如果您改为说range(2, n),它将在n-1处停止。 (另一种思考方式是,在n上加1就是使它停在n上。)

答案 3 :(得分:0)

   dic ={}
    def febo (n):
    if n in dic:
        return dic[n]
    if n<=2:
        dic[n] = 1
    else:
        dic[n]  = febo(n-1) + febo(n-2)
    return dic[n]

    if __name__ == "__main__":
        n = int(input())
        print(febo(n))

##使用这个