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




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值