Ruby Pascal 的带内存的三角形生成器

标签 ruby closures memoization

我正在尝试记住我对 Pascal 三角形生成器的实现,作为 Ruby 学习实验。我有以下工作代码:

module PascalMemo
  @cache = {}
  def PascalMemo::get(r,c)
    if @cache[[r,c]].nil? then 
      if c == 0 || c == r then 
        @cache[[r,c]] = 1
      else
        @cache[[r,c]] = PascalMemo::get(r - 1, c) + PascalMemo::get(r - 1, c - 1)
      end
    end
    @cache[[r,c]]
  end
end

def pascal_memo (r,c)
  PascalMemo::get(r,c)
end

这可以更简洁吗?具体来说,我可以用比这更简单的局部闭包创建一个全局作用域的函数吗?

最佳答案

def pascal_memo
  cache = [[1]]
  get = lambda { |r, c|
    ( cache[r] or cache[r] = [1] + [nil] * (r - 1) + [1] )[c] or
      cache[r][c] = get.(r - 1, c) + get.(r - 1, c - 1)
  }
end

p = pascal_memo
p.( 10, 7 ) #=> 120

请注意,上面的构造确实实现了记忆化,它不仅仅是一种简单的递归方法。

关于Ruby Pascal 的带内存的三角形生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13244879/

相关文章:

java - 哪些库已移植到不同的编程语言?

jquery - 使用ajax更新rails中的表数据

Javascript 闭包和回调 - 变量值在回调后不会保留

递归方法的Java记忆化

python - 在 Python 上使用 Memoization 计算一个简单的 'ATM'

Ruby GUI 绘图包?

ruby - 在 ruby​​ 中处理来自 json 的错误 UTF-8

javascript - 这是关闭吗?这有什么意义呢?

javascript - 返回函数时使用 'bind' 会创建闭包吗?

scala - 在Scala中使用哪种类型存储内存中的可变数据表?