我正在尝试记住我对 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/