因此,我正在阅读《动态编程》这本出色的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]
所以,我想了解的是:
memo = [0] *(n + 1):我得到这是一个数组,但是值如何存储在这里,如何初始化?
对于范围在(2,n + 1)中的i ::为什么一直循环到n + 1,不是应该一直循环到n吗?
仅此而已。我试图自己解密,这将有助于有python经验的人在这里帮助我。
谢谢!
答案 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
函数的内置行为。当您传入两个参数时,它们分别是其start
和stop
的值。 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))
##使用这个