2017-01-23 2 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

Сторона примечания: '|| 1' часть вашего 'counter ++ || Линия не делает ничего вообще. –

ответ

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) 
Смежные вопросы