之前看到有动态规划这个概念,然后上网搜索了下,一个比较经典的例子是斐波那契数列。
1. 递归算法:
def f(n)
if (n==0||n ==1)
return 1
end
return f(n-1)+f(n-2)
end
这个算法的复杂度是指数级的, 到n=40的时候在scraperwiki上运行时间已经要40多秒, n=50的时候超过了160秒终止了。
2. 迭代算法如下:
def f2(n)
f1 =1
f2 =1
for i in 2..n
temp =f2
f2 +=f1
f1 =temp
end
return f2
end
这个算法的复杂度是n, n =500的时候运行时间也就是1秒左右。
3. 用数组:
def f3(n)
arrayA = Array.new(n+1)
arrayA[0] = 1
arrayA[1] = 1
for i in 2..n
arrayA[i] = arrayA[i-1] + arrayA[i-2]
end
return arrayA[n]
end
数组的好处在于可以储存每个f(n)的值, 问题在于空间复杂度太高。
4. 类似迭代方法,但是不使用temp变量
def f4(n)
if n < 3
return 1
end
a = 1
b = 1
for i in 2..n - 1
b = a + b
a = b - a
end
return a + b
end