ruby的动态规划算法实现

之前看到有动态规划这个概念,然后上网搜索了下,一个比较经典的例子是斐波那契数列。

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值