2017-01-23 7 views
0

私は、関数が素数の配列内のターゲット番号を見つけるために必要な関数呼び出しの数を記録する関数を持っています。現在、グローバルスコープで宣言されているカウンタを使用しています。このカウンターを関数スコープに静的変数として入れるにはどうすればよいのですか?毎回関数が呼び出されるときに変更されません。グローバル変数を再帰関数の静的変数に置き換えます。

let primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 
 
let counter = 1 
 

 
function findPrime(arr, target){ 
 

 
    let guess = arr[Math.floor(arr.length/2)] 
 

 
    if (guess > target){ 
 

 
    arr = arr.splice(0, arr.length/2) 
 
    counter ++ 
 
    findPrime(arr,target) 
 

 
    }else if (guess < target){ 
 

 
    arr = arr.slice(arr.length/2) 
 
    counter ++ || 1 
 
    findPrime(arr,target) 
 

 
    }else{ 
 

 
    console.log('guesses taken: ' + counter) 
 
    console.log('target is: ' + guess) 
 

 
    } 
 
} 
 

 

 
findPrime(primes, 2)

+0

サイドノート: '||あなたの 'counter ++ || 1行は何もしません。 –

答えて

2

あなたは関数にリターン更新カウンタを作るので、あなたは、世界的にそれを維持する必要はありません。 ***コメントを参照してください:一般的に

let primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 
 

 
function findPrime(arr, target, counter) {    // *** 
 
    if (typeof counter === "undefined") {    // *** 
 
    counter = 1;          // *** 
 
    }             // *** 
 

 
    let guess = arr[Math.floor(arr.length/2)] 
 

 
    if (guess > target) { 
 

 
    arr = arr.splice(0, arr.length/2) 
 
    return findPrime(arr, target, counter + 1)   // *** 
 

 
    } else if (guess < target) { 
 

 
    arr = arr.slice(arr.length/2) 
 
    return findPrime(arr, target, counter + 1)   // *** 
 

 
    } else { 
 

 
    console.log('guesses taken: ' + counter) 
 
    console.log('target is: ' + guess) 
 
    return counter; 
 
    } 
 
} 
 

 

 
findPrime(primes, 2)

を、再帰関数は受け入れ、それらを追跡し、再帰を制御することを可能にする情報を返します。 ですが、非グローバル変数をクローズすることでそれを行いますが、これは通常行われる方法ではありません(ただし例外があります)。

0

機能の範囲内でカウンタをラップすることができます。

let primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 

function findPrime(arr, target) { 
    var counter = 1 
    function findPrimeInner(arr, target){ 
     var guess = arr[Math.floor(arr.length/2)] 

     if (guess > target) { 
      arr = arr.splice(0, arr.length/2) 
      counter ++ 
      findPrimeInner(arr,target) 
     }else if (guess < target){ 

      arr = arr.slice(arr.length/2) 
      counter ++ || 1 
      findPrimeInner(arr,target) 

     }else { 
      console.log('guesses taken: ' + counter) 
      console.log('target is: ' + guess) 
     } 
    } 
    findPrimeInner(arr, target); 
} 

findPrime(primes, 5) 
関連する問題