少数利用者の検索Closure



関数の中の関数?


JavaScriptに触れ始めたばかりの頃を考えると、本当に辺鄙な単語に触れたようです.その中の1つの特によく知らない単語と理解していない単語Closure😑. Javascript開発者として面接に参加するときもcloserという概念をよく聞きます.毎回関数の中の関数を機械的に答えるだけです.実は間違っていません.しかし,概念を理解することはモジュールをうまく利用することはできない.このように、Closerの概念を学び、実際の運用方法を身につけるまでには、かなりの時間がかかるようです.では、実際にClosureを使って小数発生器を直接作りましょう.Memoization技術も採用されている.😉

そうですね。いったい何が露出ですか。


MDN参照.
A closure is the combination of a function bundled together with references to its surrounding state (the lexical environment).
エンクロージャは,周囲状態(レックス環境)への参照と囲まれた関数の結合である.
大変なことになった.何を言っても難しい😯. 実際,Closerの概念は実行コンテキスト(poiemaweb大人ブログ)概念を習得すれば自然に理解できる技法である.しかし、JavaScriptを使う人は少ないので、この2つの概念を理解するのは難しい.簡単なソースモジュールを熟知しておきましょう.
function addClosure (_a) { // Outer function
  let a = _a;
  return function (b) { // Inner function
    return a + b;
  }
}
const add = addClosure(10);

add(5);  // 15
add(10); // 20
ここではClosureを用いた簡単なadd関数を実現した.addClosure()が呼び出され、関数内部変数aが初期化される.次に、bと入力し、aと加算サムの関数を返します.我々の常識では,addClosure()関数が終了すると,内部の変数と状態は当然返される.しかし、生成されたエンクロージャを実行すると、うそのようにaの状態を記憶し、新たに入力されたbと補足Samを実行することができる.簡単に言えば、エンクロージャは自分が作成した環境(LexicalEnvironment)を記憶する関数です.より詳細な説明は、次回のディスカッションでコンタクトを実行するときに行います.😣

N番目の小数を求めます


まず、ウィキペディアで少数の定義を検索します.
小数(Prime Number)は1より大きい自然数であり、1とそれ自体を除く自然数ではない.
n番目の素数を求めるアルゴリズムには多くの種類があり,その中で小学校で学んだエラトステネスのふるいで簡単に実現した.

エラトニスのふるいは上図のように2,3,5,7...小数を一緒に順番に区分できない場合は、小数で判別するアルゴリズムです.この場合、入力された数をnの平方根に演算するだけで、より効率的な演算が可能となる.
// 소수 판별 함수
function isPrimeNumber (n, primeNumbers) {
  for (const v of primeNumbers) {
    if (n % v === 0) {
      return false;
    }

    //  효율적인 연산을 위해 제곱근까지만 연산
    if (Math.sqrt(n) < c) {
      return true;
    }
  }
  return true;
}
これは素数として認識でき,nとこれまで計算された素数を受け入れて素数を判別できる関数である.
function closurePrimeNumber () {
  //  소수를 저장할 저장소
  const primeNumbers = [2]

  return function (n) {
    //  이미 n번째 소수를 찾았다면
    if (primeNumbers.length >= n) {
      //  n번째 소수를 전달해준다.
      return primeNumbers[n - 1]
    }

    //  아직 찾지 못했다면
    //  가장 마지막수를 선택해서 1씩 더하면서 해당수가 소수인지 판별한다.
    let targetNumber = primeNumbers[primeNumbers.length - 1]
    while (primeNumbers.length < n) {
      targetNumber += 1

      //  해당수가 소수인지 판별하고
      if (isPrimeNumber(targetNumber, primeNumbers)) {
        //  소수일경우 소수 저장소에 저장한다.
        primeNumbers.push(targetNumber)
      }

      //  n번째 소수를 찾았다면
      if (primeNumbers.length >= n) {
        //  해당 수를 사용자에게 전달한다.
        return targetNumber
      }
    }
  }
}
次に、primeNumbersを含むOuter Function(closurePrimeNumber)を作成し、これまでに算出された素数を記憶する.この関数の戻り値は数字nであり、この関数の役割はn番目の小数を判別して伝達することである.
const genPrimeNumber = closurePrimeNumber()

genPrimeNumber(10000) // 1
genPrimeNumber(10001) // 2

/*
*   10000번째 소수: 104729
*   1 function: 12.047ms
* 
*   100001번째 소수: 104743
*   2 function: 0.536ms
 */
closurePrimeNumber()を実行すると、primeNumbersをキャビネットとする関数が返され、n番目の素数が検索されます.このとき、primeNumbersはエンクロージャ内部でキャッシュされるため、見つかった値をスキップして次の小数点をすばやく検索できます.

n/a.結論


こうして,Closerを用いてN番目の素数を探すコードを記述した.実際,モジュールの特性を知らず知らずに利用して開発することが多い.たとえば、非同期関数を作成したり、上記の例のように演算キャッシュを行ったり、内部変数へのアクセスを外部でブロックしたりする場合は、いくつかの経験があります.要するに、この文章が少し役に立つことを望んで、簡単なWebアプリケーションを作って、上で作成した関数を実際に体験することができます.やってみるとよさそうだ😁.
賛辞やコメントが大きな力になります
最後に新しいブログが作成されました.私を探しに来るたびにあなたに大きな力を与えます.🥰