改进递归方法

时间:2015-06-30 02:28:40

标签: ruby

这种Fibonacci方法适用于较小的数字,但是当计算得很远时计算将不起作用。如何存储在较低级别循环中完成的操作以便在以后的循环中重复使用?

def fib(n)
  return 0 if n==0
  return 1 if n==1
  fib(n-1) + fib(n-2)
end

2 个答案:

答案 0 :(得分:3)

这是使用Hash记忆这样一个方法的一种非常基本的方法。

@fib_memo = {}

def fib(n)
  return 0 if n == 0
  return 1 if n == 1
  return @fib_memo[n] if @fib_memo.key?(n)
  @fib_memo[n] = fib(n - 1) + fib(n - 2)
end

看看如何缩短这一点并不需要太多想象力:

@fib_memo = { 0 => 0, 1 => 1 }

def fib(n)
  @fib_memo[n] ||= fib(n - 1) + fib(n - 2)
end

或者,正如spickermann演示的那样,你可以在Hash的默认过程中完成所有操作,但这只是炫耀。 ;)

答案 1 :(得分:2)

您可以使用哈希来存储较低级别的周期:

fibonacci = Hash.new { |h, k| h[k] = k < 2 ? k : h[k-1] + h[k-2] }
fibonacci[100]
#=> 354224848179261915075