JavaScript閉鎖のFibonacci数列
4984 ワード
JavaScriptが閉じているのはJavaScriptの高級な勉強に必要な道です.ですから、クローズドをよりよく理解するために、クローズドに関するいくつかのケースを記録します.Fibonacci関数は私たちがよく知っている関数です.一般的に再帰的な方法で実現します.しかし、再帰は二叉樹の深さを遍歴していることはよく知られています.この方法は簡単に書いても、効率はそんなに高くないです.ここでFibonacci数列を実現する3つの方法を提供します.再帰法
クローズド?デリバリー法
クローズド・デリバリーとは、クローズド・パックの原理を利用して、1つの配列(初期は「1,1」のFibonacci数列)を、2つの関数の中間に存在させ、内部関数を介して連続的に呼び出された配列で、配列をグローバル変数としてメモリに格納することで、このFibonacci数列を拡張し、最終的に所望のFibonacci数を求めます.以下のコード例です.
配達法
デリバリー法は最も効率的で、forサイクルの中でフィバ(n-1)とフィバ(n-2)の値を変えて、最終的な結果を求めます.コードは以下の通りです.
3つの方法を呼び出す
var count;
var count=0;
var fib=function(n){
count++;
if(n==1||n==2){
return 1;
}
else{
return fib(n-2)+fib(n-1);
}
}
このようなコードで示したように、再帰法は最も簡単な解決法であり、ここでcount変数を定義し、3つの方法の実行効率を比較するためである.クローズド?デリバリー法
クローズド・デリバリーとは、クローズド・パックの原理を利用して、1つの配列(初期は「1,1」のFibonacci数列)を、2つの関数の中間に存在させ、内部関数を介して連続的に呼び出された配列で、配列をグローバル変数としてメモリに格納することで、このFibonacci数列を拡張し、最終的に所望のFibonacci数を求めます.以下のコード例です.
var count2=0;
var fiba = (function(){
var arr = [0,1,1]; // 0 ,
return function(n){
count2++;
var res=arr[n]; /* arr, , arr */
if(res){
return res;
}else{
arr[n]=fiba(n-1)+fiba(n-2);
return arr[n];
}
}
})();
再帰的にも使用されていますが、クローズドバックは再帰回数が大幅に減少しています.最初にfiba(3)に戻りますので、fiba(3)を配列に格納することができます.これは配列中のarr[3]+arr[2]によって、fiba(4)の値を得て、数組の中に格納して、このように往復して、最終結果を得ることができます.これは典型的に空間で時間を換える例であると言える.配達法
デリバリー法は最も効率的で、forサイクルの中でフィバ(n-1)とフィバ(n-2)の値を変えて、最終的な結果を求めます.コードは以下の通りです.
var count3 = 0;
var fib3 = function (n) {
var x = 1;
var y = 1;
var z = 0;
if (n == 1 || n == 2) {
return 1;
} else {
for (var i = 2; i < n; i++) {
count3++;
z = x + y;
x = y;
y = z;
}
return z;
}
};
この方法も比較的よく理解されるべきで、ここでは多すぎる説明はしないで、以下は呼び出しプロセスであり、同じ場合にそれぞれcountの値を与えている.3つの方法を呼び出す
onload=function(){
var t = fib(8);
alert(t); // 21
alert(count); //count=41
var z=fiba (8);
alert(z); // 21
alert(count2); //count2=13
var m = fib3(8);
alert(m); // 21
alert(count3); //count3=6
}
上記の例から、デリバリーの効率が最も高く、次いで閉込めであり、再帰法の効率が最も低いことが分かる.閉塞効率は相対的な再帰法によってかなり高くなりましたが、この方法は不適切な使用によってメモリが漏れてしまいます.大きなFibonacci数を要求すると、arr配列の占める空間がますます大きくなります.また、システムが絶えず引用されてメモリが解放されなくなり、メモリが漏れてしまいます.ですから、クローズドを使う時は、この点に注意してください.