上回練習寫 Memorization 已是高中的事了, 那時用 C 練程式競賽, 不過 C 沒有恰當的 scope 維護方式, Memorization 寫起來較醜一些, 表格得存在全域變數或函式內的靜態變數。JavaScript 配合 Closure 很漂亮地解決表格的 scope 問題, 以下是參考書上的範例練習寫的碼, 幾乎長得一樣啦。
var memorizer = function(memo, fundamental) { var shell = function (n) { if (memo[n] === undefined) { memo[n] = fundamental(shell, n); } return memo[n]; }; return shell; }; var fib = memorizer([0, 1], function(shell, n) { return shell(n - 1) + shell(n - 2); }); var factorial = memorizer([1], function(shell, n) { return n * shell(n - 1); }); fib(5); // 5 fib(10); // 55 factorial(10); // 3628800memorizer 的第二個參數的函式得多加一個 "shell" 欄位, 讓 memorizer 產生暫時的函式 shell, 再將它傳進目標函式, 這樣 fib / factorial 裡用的 shell 就是有 memorization 效果的函式了。
初看的時候腦筋會打結吧, 看懂後覺得很有意思。
沒有留言:
張貼留言