Ruby 红宝石斐波那契
是一个问题,我解决了:Ruby 红宝石斐波那契,ruby,Ruby,是一个问题,我解决了: @cache={} @cache[1]=0 @cache[2]=1 def fib(n) @fibs[n-1] end def fib_m(n) @cache[n] ||= fib_m(n-1) + fib_m(n-2) end @fibs=[] @fibs=(1..100000).map{|n| fib_m(n)} 但这看起来很粗糙。看起来我要加倍缓存,我必须硬编码一些上限。有没有更干净的方法可以做到这一点?如果在Ruby中启用尾部调用优化,您可能会递归
@cache={}
@cache[1]=0
@cache[2]=1
def fib(n)
@fibs[n-1]
end
def fib_m(n)
@cache[n] ||= fib_m(n-1) + fib_m(n-2)
end
@fibs=[]
@fibs=(1..100000).map{|n| fib_m(n)}
但这看起来很粗糙。看起来我要加倍缓存,我必须硬编码一些上限。有没有更干净的方法可以做到这一点?如果在Ruby中启用尾部调用优化,您可能会递归地获得相同的结果,这会更快、更少的内存消耗和更优雅
RubyVM::InstructionSequence.compile_option = {
tailcall_optimization: true,
trace_instruction: false
}
def fib(curr = 1, acc = 0, n)
n <= 0 ? acc : fib(acc, curr + acc, n - 1)
end
fib(100_000).to_s.length
#⇒ 20899
RubyVM::InstructionSequence.compile\u选项={
tailcall_优化:正确,
trace\u指令:false
}
def fib(电流=1,附件=0,n)
N
有没有更干净的方法
您可以分配一个以动态计算缺少的哈希值:
fib = { 0 => 0, 1 => 1 }
fib.default_proc = ->(f, n) { f[n] = f[n-1] + f[n-2] }
fib[10]
#=> 55
fib
#=> {0=>0, 1=>1, 2=>1, 3=>2, 4=>3, 5=>5, 6=>8, 7=>13, 8=>21, 9=>34, 10=>55}
请注意,这种方法受到Ruby堆栈大小的限制。检查示例:What is CW。。。。。。。CW是codewars,编程网站。不要假设每个人都知道。@sawa你的意思是它应该是“我解决了”?使用default\u proc
的好方法。注意RubyVM
是YARV的私有内部实现细节,在MRI(一些教程仍然使用)、JRuby、IronRuby、Rubinius、MagLev或Opal上不起作用。还要注意,Ruby语言规范、RubySpec、Ruby编程和RDoc文档都不能保证TCO。