![](/img/trans.png)
[英]Recursive function, maintain a global counter without using a global variable
[英]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.