动态规划 - 斐波那契

时间:2015-12-03 00:05:43

标签: python dynamic fibonacci

基本上,我是一名学习程序员,本周我开始介绍动态编程。我们的任务是使用动态编程找到Fibonacci序列。提供了这个伪代码,显然是在一个函数中:

init table to 0s
if n ≤ 1
   return n
else
   if table[n-1] = 0
      table[n-1] = dpFib(n-1)
   if table[n-2] = 0
      table[n-2] = dpFib(n-2)
   table[n] = table[n-1] + table[n-2]
return table[n]

大部分内容很容易更改为代码,但我不确定如何初始化0表。我知道它应该是一个列表,但我不确定它应该在函数内部还是外部,或者我应该用它初始化多少个零。这就是我写的,没有什么复杂的:

def dynamicFibo(n):
   # initialise table of 0s
   #base case
   if n <= 1:
       return n
   #recursive case
   else:
       if table[n-1] ==  0:
           table[n-1] = dynamicFibo(n-1)

       if table[n-2] ==  0:
           table[n-2] = dynamicFibo(n-2)

       table[n] = table[n-2] + table[n-2]
   return table[n]

如果有人能告诉我如何解决这个问题,我将感激不尽。另外,总的来说,我很难理解动态编程的基础,所以如果有任何好的资源,你可以建议我会很高兴,或者即使你能给出一个很好的解释。

2 个答案:

答案 0 :(得分:3)

您可以使用以下内容初始化table

table = [0 for _ in range(n+1)]

因为您希望表中至少包含n+1个项以允许访问table[n](请记住,列表是零索引的,因此nth项可以{{1}访问}})

但是,您希望确保每次都不创建新列表,因为这会破坏动态编程的目的。因此,您可以将(n-1)称为“不可见”参数,即具有在每次递归调用时使用的默认参数的参数。您的功能将如下所示:

table

reference

正如您所看到的,我使用了while循环而不是列表理解。这基本上是相同的,除了我们不能更改>>> def dynamicFibo(n,table = []): while len(table) < n+1: table.append(0) #this does the same thing except it doesn't change the reference to `table` #base case if n <= 1: return n #recursive case else: if table[n-1] == 0: table[n-1] = dynamicFibo(n-1) if table[n-2] == 0: table[n-2] = dynamicFibo(n-2) table[n] = table[n-2] + table[n-1] return table[n] >>> dynamicFibo(12) 144 >>> dynamicFibo(300) 222232244629420445529739893461909967206666939096499764990979600 的引用,否则递归调用将每次创建一个新表,除非你作为参数传递它。如果您使用不断增加的数字多次调用table,则还可以根据需要扩展表,但保留所有旧数字。通过在函数中添加dynamicFibo行可以清楚地看到这一点:

print(table)

我在>>> dynamicFibo(12) [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 2, 3, 5, 0, 0, 0, 0, 0, 0, 0] [0, 1, 1, 2, 3, 5, 8, 0, 0, 0, 0, 0, 0] [0, 1, 1, 2, 3, 5, 8, 13, 0, 0, 0, 0, 0] [0, 1, 1, 2, 3, 5, 8, 13, 21, 0, 0, 0, 0] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 0, 0, 0] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 0, 0] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 0] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] 144 >>> dynamicFibo(14) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 0] [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377] 377

之前添加了print(table)

答案 1 :(得分:2)

有一个简单的解决方案适用于每个人...

def fib(n):
    table = []
    table.append(0)
    table.append(1)
    for i in range(2, n+1):
        table.append(table[i-1] + table[i-2])
    return(table[n])