2017-01-23 3 views
0

Ich habe eine Funktion, die die Anzahl der Funktionsaufrufe protokolliert, die die Funktion benötigt, um eine Zielnummer in einem Array von Primzahlen zu finden. Ich verwende derzeit einen Zähler, der im globalen Gültigkeitsbereich deklariert ist. Wie setze ich diesen Zähler als statische Variable in den Funktionsumfang, damit er sich nicht ändert, wenn die Funktion jedes Mal aufgerufen wird?Globale Variable durch statische Variable in rekursiver Funktion ersetzen

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

Randnotiz: Die '|| 1' Teil deines 'Zählers ++ || 1'-Linie macht überhaupt nichts. –

Antwort

2

Sie machen die Funktion Rückkehr die aktualisierte Zähler, so dass Sie es nicht global halten müssen; siehe *** Kommentare:

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)

Im allgemeinen rekursiven Funktionen übernehmen und Informationen zurückgeben, die ihnen erlaubt, zu verfolgen und die Rekursion zu steuern. Während Sie können tun, indem Sie über eine nicht-globale Variable schließen, ist das nicht, wie sie normalerweise getan werden (obwohl es Ausnahmen gibt).

0

Sie können den Zähler in den Funktionsumfang einbinden.

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) 
Verwandte Themen