需求
在1到n的正整数中,1一共出现了几次?
初步思考 使用递归
经过接近一个小时的排查,写出了没有bug的方法,
代码为:
function num(count) {
if(count < 0) return;
var n = String(count).split('');
if (n.length <= 1) {
if (Number(n[0]) == 0) {
let um = sum;
sum=0;
return um;
}
if (Number(n[0]) == 1) {
sum+=1;
}
return num(count -1);
}
n.forEach((val) => {
if (Number(val) == 1){
sum++
}
})
return num(count -1);
num(13); // 6;
num(6); // 1;
- 我发现,这样写,sum将会暴露在全局,可能会对全局变量有污染所以我想到了闭包原理 ;
闭包之优化
闭包是内部变量不能被外部获取,并且存储数据
// 创建一个外部包裹
function sumWarp() {
let sum = 0;
return (function num(count) {
if(count < 0) return;
var n = String(count).split('');
if (n.length <= 1) {
if (Number(n[0]) == 0) {
let um = sum;
sum=0;
return um;
}
if (Number(n[0]) == 1) {
sum+=1;
}
return num(count -1);
}
n.forEach((val) => {
if (Number(val) == 1){
sum++
}
})
return num(count -1);
})
}
var s = sumWarp();
s(13); //6
s(8); //1;
结果
优化之后的方法,sum不会污染到全局,并且只能在内部访问,