CnPack Forum » 技术板块灌水区 » 一个泛型的 memoize 实现


2010-12-17 23:26 zzzl
一个泛型的 memoize 实现

[size=3]这个方法的原文在[/size][url=http://blogs.teamb.com/craigstuntz/2008/10/01/37839/][size=3]http://blogs.teamb.com/craigstuntz/2008/10/01/37839/[/size][/url][size=3]  作者似乎讲的很罗嗦,不过如果看完后觉得它没有意义,最好看下原文或搜索下memoize,另外在这个实现里,作者的方法有点巧妙,不为了memoize也可以下载完整的代码看下。[/size]
[size=3][/size]
[size=3]我把它的示例代码简化了一下贴出来,再加上注释,方便大家看。[/size]



[size=3][color=#000080][b]class[/b][/color] [color=#000080][b]function[/b][/color] [color=#000000]TfrmMemoize[/color][color=#000000].[/color][color=#000000]SlowIncrement[/color]([color=#000000]ANum[/color][color=#000000]:[/color] [color=#000080][b]integer[/b][/color])[color=#000000]:[/color] [color=#000080][b]integer[/b][/color];  [/size][size=3][color=darkgreen]//先是定义了一个需要缓存结果的函数
[/color][color=#000080][b]begin[/b][/color]
  [color=#000000]Sleep[/color]([color=#0000ff]1000[/color]); [/size][size=3][color=darkgreen]//[i]假设这个函数需要花费大量的时间,比如从网络上获取数据之类的,这里用等待一秒来模拟。[/i]
[/color]  [color=#000000]Result[/color] [color=#000000]:=[/color] [color=#000000]ANum[/color] [color=#000000]+[/color] [color=#0000ff]1[/color];
[color=#000080][b]end[/b][/color];
[/size]
[color=#000080][b][size=3][/size][/b][/color]
[color=#000080][b][size=3][color=#000080][b]procedure[/b][/color][color=#000000] [color=#000000]TfrmMemoize[/color][color=#000000].[/color][color=#000000]FormCreate[/color]([color=#000000]Sender[/color][color=#000000]:[/color] [/color][color=#000080][b]TObject[/b][/color][/size][size=3][color=#000000]);
[/color][color=#000080][b]begin[/b][/color]
[color=#000000]  [color=#000000]FMemoizedFunc[/color] [color=#000000]:=[/color] [color=#000000]TMemoize[/color][/color][color=#000000].[/color][color=#000000]Memoize[/color][color=#000000]<[/color][color=#000080][b]integer[/b][/color][color=#000000],[/color][color=#000080][b]integer[/b][/color][color=#000000]>[/color][color=#000000]([color=#000000]SlowIncrement[/color]);  [/color][color=#006400]//这句执行后,FMemoizedFunc就好象是指代了SlowIncrement函数,对FMemoizedFunc的调用,也就是对SlowIncrement的调用,但是它缓存了函数的结果。[/color]
[color=#000080][b]end[/b][/color][color=#000000];[/color]
[/size][/b][/color]
[color=#000080][b][size=3][color=darkgreen]//第一次点button1时,会等待一秒才出结果,而第二次点,则立即出现了[/color][/size][/b][/color]
[size=3][color=#000080][b]procedure[/b][/color] [color=#000000]TfrmMemoize[/color][color=#000000].[/color][color=#000000]Button1Click[/color]([color=#000000]Sender[/color][color=#000000]:[/color] [color=#000080][b]TObject[/b][/color]);
[color=#000080][b]var[/b][/color]
  [color=#000000]Input[/color][color=#000000]:[/color] [color=#000080][b]integer[/b][/color];
[color=#000080][b]begin[/b][/color]
  [color=#000080][b]if[/b][/color] [color=#000000]TryStrToInt[/color]([color=#000000]edtInput[/color][color=#000000].[/color][color=#000000]Text[/color][color=#000000],[/color] [color=#000000]Input[/color]) [color=#000080][b]then [/b][/color]
     [color=#000000]edtOutput[/color][color=#000000].[/color][color=#000000]Text[/color] [color=#000000]:=[/color] [color=#000000]IntToStr[/color]([color=#000000]FMemoizedFunc[/color]([color=#000000]Input[/color]));  [color=#006400]//如果showIncrement函数曾经用input参数计算过,就直接取回它的值,否则就进行实际的函数调用。[/color]
[color=#000080][b]end[/b][/color];
[/size]

[size=3]用工具网站给代码加的高亮,在这用了几次复制粘贴格式有点乱了:L [/size]
[size=3][/size]
[size=3]完整代码在附件里。[/size]
[size=3][/size]
[size=3]这个方法的一个问题是,被memoize的函数只能有一个泛型参数,如果想幽雅的实现多个似乎是个挑战,也许以后有时间我会完善它[/size]

2011-8-18 10:25 friendlinzh
Sleep(1000) :loveliness: :loveliness: :loveliness:

页: [1]
查看完整版本: 一个泛型的 memoize 实现


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.