斐波那契数列是经典的递归算法问题,也可以用动态规划进行解决。下面从斐波那契数列这个问题来看递归和动态规划的区别。
递归方法:
def fibonacci(n):
if n<=1:
return n
else:
return fibonacci(n-1)+fibonacci(n-2)
这是斐波拉契数列的递归实现。从代码中可以看出,通过递归的方式来实现斐波那契数列,递归过程由于重复计算了很多相同的元素,时间复杂度较高,不适合解决大规模的数据。
接下来看动态规划方法:
def fibonacci(n):
if n<=1:
return n
else:
f = [0]*(n+1)
f[1] = 1
for i in range(2,n+1):
f[i] = f[i-1]+f[i-2]
return f[n]
这里使用动态规划来解决斐波那契数列问题。动态规划常用来解决子问题相互重叠的问题,将原问题分解成若干子问题,从简单的子问题开始逐步往上推,直到推出原问题的解。上述动态规划实现中,由于利用了缓存数组,保存了已经计算的数值,当需要使用到之后的值计算时,就可以直接从数组中获取,避免了重复计算,时间复杂度降低至O(n)。
从上面的分析可以看出,递归和动态规划的主要区别在于它们处理子问题的方式不同,递归是从上到下进行单一递归,而动态规划是从下到上计算子问题,且将结果缓存起来,避免了重复计算。适当的情况下,使用动态规划能够大大提高程序运行效率,特别是在原问题解决需要的子问题非常多的情况下。