繁体   English   中英

在递归函数中用静态变量替换全局变量

[英]Replace global variable with static variable in recursive function

我有一个函数,该函数记录函数在素数数组中查找目标数所需的函数调用次数。 我目前使用在全局范围内声明的计数器。 我如何将该计数器作为静态变量放入函数范围,以便每次调用该函数时它都不会改变?

 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) 

您可以使函数返回更新后的计数器,因此不必全局维护它。 ***评论:

 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) 

通常,递归函数接受并返回信息,使它们可以跟踪和控制递归。 尽管可以通过关闭非全局变量来完成此操作,但这并不是通常情况下完成的操作(尽管有例外)。

您可以将计数器包装在功能范围内。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM