在 memoizition 中使用数组和对象作为缓存有什么不同?

What is different between using array and object as cache in memoizition?

斐波那契数列传统上用于解释树递归。

function fibonacci(n) {
   if(n==0 || n == 1)
       return n;
   return fibonacci(n-1) + fibonacci(n-2);}

我想实现记忆解决方案。这是我的代码:

  var fibonacci = (function(){
  var cache = [];
  return function(n){
    if(n==0 || n == 1){
      return n;
    }else{
      cache[n-1] = cache[n-1]||fibonacci(n-1);
      cache[n-2] = cache[n-2]||fibonacci(n-2);
      return cache[n-1]+cache[n-2];
    }
  }
})();

但这是另一个被许多人投票选为最佳实践的答案:

var fibonacci = (function () {
  var cache = {};

  return function(n) {

    // Base case
    if(n==0 || n == 1)
        return n;

    // Recurse only if necessary
    if(cache[n-2] === undefined)
      cache[n-2] = fibonacci(n-2);
    if(cache[n-1] === undefined)
      cache[n-1] = fibonacci(n-1);

    return cache[n-1] + cache[n-2];
  };
})(); 

我想知道在 memoizition 中使用数组和对象作为缓存有什么不同?

数组和对象之间始终存在的相同差异。

数组据说针对整数属性进行了优化,而对象在各种 属性 名称上表现更好,尤其是稀疏名称。对于您的应用程序,斐波那契数列、数组确实更适合。