Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 红宝石斐波那契_Ruby - Fatal编程技术网

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。