论坛首页 编程语言技术论坛

ruby 写的求fib数的性能问题

浏览 5771 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-25  
代码:

def fib(n)
  (n>=2)?fib(n-2)+fib(n-1):n
end

print(fib(20)+"\n")
#print(fib(40)+"\n")


求fib过程中,n<=20速度还算快,n>30都出不来了,dos窗口一直没有自动关闭.

用java写很快就出来了,不知道是什么原因造成这样的结果呢?
   发表时间:2007-10-25  
试试尾递归

def fib(n)
	if n==0
		return 0
	else
		return tailRecursionFib(n, 1, 0)
	end
end

def tailRecursionFib(n, f1, f2)
	if n==1
		return f1
	else
		return tailRecursionFib(n-1, f1+f2, f1)
	end
end
0 请登录后投票
   发表时间:2007-10-25  
ruby并没有尾递归优化,这个东西应该转成迭代来处理吧
0 请登录后投票
   发表时间:2007-10-25  
<layer id="google-toolbar-hilite-0" style="background-color: Fuchsia; color: black;">ruby</layer> 代码
 
  1. def fib(n)    
  2.   fib_iter(n, 1, 0)    
  3. end    
  4. def fib_iter(n,i, j)    
  5.   return i if n==1  
  6.   fib_iter(n-1, i + j, i)    
  7. end   

这个尾递归版本,fib(10000)仍然可以计算,再增加一个数量级就栈溢出了
0 请登录后投票
   发表时间:2007-10-25  
尾递归在这里表现的快一些的原因,我想是因为尾递归版本是将结果作为方法参数传入,那么在计算结束后,不需要弹出栈就可以得到结果
0 请登录后投票
   发表时间:2007-10-26  
这种的递归在ruby 1.8中是非常非常的慢,很多时间都浪费在维护ruby自己的堆栈上.

ruby 2.0中这个问题得到解决.2.0改用了基于bytecode的执行引擎,能快上几十倍.

xruby在这方面都比ruby 1.8快很多:
http://xruby.iteye.com/blog/69937
0 请登录后投票
   发表时间:2007-10-31  
ruby 代码
  1. Fib = Hash.new|h, n| n < 2 ? h[n] = n : h[n] = h[n - 1] + h[n - 2] }       
  2. puts Fib[50]   

发现这个是最快的~~

0 请登录后投票
   发表时间:2007-11-01  
pure 写道
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-rb">
    <li class="alt"><span><span>Fib&nbsp;=&nbsp;</span><span class="builtin">Hash</span><span>.</span><span class="keyword">new</span><span>{&nbsp;</span><span class="variable">|h</span><span>,&nbsp;n|&nbsp;n&nbsp;&lt;&nbsp;2&nbsp;?&nbsp;h[n]&nbsp;=&nbsp;n&nbsp;:&nbsp;h[n]&nbsp;=&nbsp;h[n&nbsp;-&nbsp;1]&nbsp;+&nbsp;h[n&nbsp;-&nbsp;2]&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>puts&nbsp;Fib[50]&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>发现这个是最快的~~</p>
to ls:
用查表的方法什么语言都可以变为O(n)的量级
这个没有意义的
0 请登录后投票
   发表时间:2007-11-01  
怎么把9楼投隐藏阿?
我觉得挺有趣的,不要因为楼上帖子大家就不继续发言了.
0 请登录后投票
   发表时间:2007-12-01  
看这里:http://antoniocangiano.com/2007/11/28/holy-shmoly-ruby-19-smokes-python-away/
Mac OS X 10.5 with MacBook Pro (Core 2 Duo 2.2 GHz and 2 GB of memory)
def fib(n)
if n == 0 || n == 1
n
else
fib(n-1) + fib(n-2)
end
end

36.times do |i|
puts "n=#{i} => #{fib(i)}"
end

Ruby 1.8.6: 158.869s
Python 2.5.1: 31.507s
Ruby 1.9.0: 11.934s
等待Xmas礼物Ruby1.9吧
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics