Các hàm có thể dùng các đối tượng hay mảng để ghi lại kết quả của các thao tác trước đó, nhờ thế tránh được những việc lặp lại không cần thiết. Cách thức này gọi là memoization.

Ví dụ tính dãy số Fibonacci như sau:


var fibonacci = function (n) {

return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);

};

for (var i = 0; i <= 10; i += 1) {

alert('// ' + i + ': ' + fibonacci(i));

}

Thực thi đoạn mã trên.

Kết quả:


// 0: 0

// 1: 1

// 2: 1

// 3: 2

// 4: 3

// 5: 5

// 6: 8

// 7: 13

// 8: 21

// 9: 34

// 10: 55

Trong ví dụ trên hàm Fibonacci được gọi 453 lần (chúng ta gọi 11 lần và hàm Fibonacci gọi chính nó 442 lần) và đây là sự lãng phí không cần thiết. Khắc phục vấn đề này với kĩ thuật memoization bằng cách lưu các kết quả đã làm được trong một mảng tên memo và với kết quả đã được lưu trong memo, hàm Fibonacci sẽ không lặp lại việc gọi chính nó – một sự lãng phí không cần thiết:


var fibonacci = function () {

var memo = [0, 1];

var fib = function (n) {

var result = memo[n];

if (typeof result !== 'number') {

result = fib(n - 1) + fib(n - 2);

memo[n] = result;

}

return result;

};

return fib;

}();

for (var i = 0; i <= 10; i += 1) {

alert('// ' + i + ': ' + fibonacci(i));

}

Thực thi đoạn mã trên.

Lần này hàm Fibonacci được gọi 29 lần (11 lần gọi và 18 lần gọi lấy kết quả từ memo).

< Hàm (functions)