7
votes

Explication sur "JavaScript - Les bonnes parties" Exemple (section 4.15)?


2 commentaires

Je m'attendrais à ce que le livre passe en détail sur la façon dont la fonction fonctionne - y a-t-il quelque chose en particulier que vous ne comprenez pas?


Hé, j'ai récemment fait une courte vidéo sur la mémoisation de base à l'aide de JavaScript - peut-être que cela aide à comprendre Memoizer: YouTube .com / montre? v = lsp82x0xxdsy


4 Réponses :


1
votes

Pour évaluer la fonction, vous devez simplement l'appeler:

fibonacci(15)


3 commentaires

Merci de commenter, j'ai une question légèrement modifiée. Je préférerais entendre une explication détaillée Pourquoi Fibonacci (15) appelle fonctionne? Shell & N Opération est vague pour moi ...


À peu près sûr qu'il cherche quelqu'un à la promenade de la manière dont le code fonctionne, en utilisant 15 comme exemple d'entrée


Pour voir comment cela fonctionne dans les détails absolus, vous pouvez à nouveau télécharger Firebug, puis passer à travers un appel à Fibonacci (15) en utilisant le débogueur. Recherchez l'étape dans le bouton. Vous pouvez ajouter une expression de montre "n" pour vous montrer quelle est la valeur de n est telle qu'elle change.



1
votes

Comme les commentaires à votre question suggèrent, vous devriez passer à travers le code dans un débogueur pour bien comprendre ce qui se passe si vous ne pouvez pas suivre l'explication dans le livre. Mais je vais vous donner un bref aperçu de ce qui se passe:

Qu'est-ce qui est démontré est la «mémoiation» qui est une technique d'optimisation courante utilisée dans la programmation fonctionnelle. On dit qu'une fonction est pure si le résultat ne dépend que des arguments qui y sont passés. Donc, si une fonction est pure, vous pouvez mettre en cache le résultat en fonction des arguments - cette technique est appelée mémoisation. Vous feriez cela si une fonction est coûteuse à calculer et s'appelle plusieurs fois.

L'exemple classique utilisé pour démontrer cela (comme ici) génère Numéros de Fibonacci . Je ne vais pas passer à travers la manière dont ils sont élaborés, mais en gros, lorsque vous allez à des numéros plus élevés et plus élevés, vous vous répétez de plus en plus, car chaque numéro est calculé à partir des deux numéros précédents. En mémoronnant chaque résultat intermédiaire, il vous suffit de les calculer une fois d'une fois, ce qui rend l'algorithme beaucoup plus rapide (beaucoup plus rapide que vous allez plus haut de la séquence).

En ce qui concerne ce code concerné, le mémoizeur prend deux paramètres - «Mémo» qui est le cache. Dans ce cas, il se passe avec les deux premières valeurs déjà remplies dans le '[0,1]' - ce sont les deux premiers numéros de Fibonacci.

Le deuxième paramètre est la fonction à laquelle la mémoire sera appliquée. Dans ce cas, une fonction Fibonacci récursive:

fonction (shell, n) { shell de retour (N - 1) + coquille (n-2); }

I.e. Le résultat est la somme des deux nombres précédents dans la séquence.

Le mémoizeur d'abord des chèques pour voir s'il a déjà un résultat mis en cache. Si cela le fait, cela revient immédiatement. Sinon, il calcule le résultat et le stocke dans le cache. Sans cela, cela se répéterait encore et encore et rapidement et rapidement lentement une fois d'accéder aux nombres plus élevés de la séquence.


2 commentaires

Merci pour votre réponse. Cependant, ma partie vague était différente, mais je l'ai déjà fait par moi-même :) ... je me demandais comment 15 est passé dans le corps de Mémoire Fonction lorsque fibonacii (15) est appelé. La réponse est triviale :): Memoizer renvoie une fonction (n) ( shell variable), donc var fibonacci qui est attribué à une fonction (n) retourné par Memoizer Accepte n = 15 .


@Maxp. Votre commentaire est encore plus utile que la réponse que c'était le problème que j'avais ASWELL, d'autant plus que le livre ne fournit pas l'énoncé d'invocation1



3
votes

Voici un console.log () code> version annotée qui tente de montrer comment la pile renvoie et attribue le résultat de (N-1) + (n-2) au tableau MEMO pour chaque appel récursif. N'oubliez pas non plus que la pile revient dans l'ordre inverse. Donc, dans la sortie enregistrée, vous verrez le dernier appel renvoyé en premier:

var memoizer = function (memo, fundamental) {
    var shell = function (n) {
        var result = memo[n];
        if (typeof result !== 'number') {
            result = fundamental(shell, n);
            console.log("Hence 'shell(n-1)+shell(n-2)' results in the assignment memo["+n+"]="+result);
            memo[n] = result;
        }
        return result;
    };
    return shell;
};
var fibonacci = memoizer([0, 1], function (shell, n) {
    console.log("shell is called, and 'n' is equal to --> " + n + "\n" + "At this point shell(n-1)="+shell(n-1)+" AND shell(n-2)="+shell(n-2));
    return shell(n - 1) + shell(n - 2);    
});


0 commentaires

2
votes

On dirait que vous êtes confus sur la raison pour laquelle l'invocation fibonacci (15) code> fonctionne. Simplifiez le code (oubliez la mémoire de mémoisation pour une seconde).

var f = function (n) { console.log(n); };


0 commentaires