为什么C:\dev\Python36-32\python.exe C:/dev/PythonProjects/untitled4/main.py
using floats: -1.1703014024533338e-10
using Decimals() w/ prec=19: -4.289200000000001210E-13
using Decimals() w/ prec=500: 0E-700
Process finished with exit code 0
方法之外的变异变量被视为不良做法?在下面的例子中,我正在改变从reduce方法内部声明的变量。为什么不建议这样做?
.reduce()

答案 0 :(得分:0)
见@JordanRunning评论:
"如果你这样做,为什么还要使用reduce呢?如果您的输出是通过副作用,您也可以使用forEach"
我正要说同样的话。这是一个没有外部依赖的函数版本:
function balanceParens(string) {
let res = string.split("").reduce((state, char) => {
// Handle if parens open and close out of order
if (state.counter < 0) {
return state;
}
// Add 1 for each open in order
if (char === "(") {
if (++state.counter > state.max) {
state.max = state.counter;
}
return state;
}
// subtract 1 for each close in order
if (char === ")") {
state.counter = --state.counter;
return state;
}
// handle use case if char is not a paren
return state;
}, {max: 0, counter: 0});
console.log("Max depth was :", res.max);
return !res.counter;
}
console.log(balanceParens("((()(((())))))((((()))))"));
&#13;
答案 1 :(得分:0)
为什么
.reduce()
方法之外的变异变量被认为是不好的做法?
因为您正在将功能与命令式方法混合在一起。保持一个范例,而不是让每个人感到困惑。
你会选择
reduce
使用纯回调和no side effects
function step({max: oldMax, counter: oldCounter}, char) {
const counter = oldCounter + (char=="(") - (char==")");
const max = counter > oldMax ? counter : oldMax;
return {max, counter};
}
function maxParensLevel(string) {
assert(hasBalancedParens(string));
const {max, counter} = string.split("").reduce(step, {max:0, counter:0});
return max;
}
或一个简单的循环和两个可变变量
function maxParensLevel(string) {
assert(hasBalancedParens(string));
let max = 0;
let counter = 0;
for (const char of string.split("")) {
if (char == "(")
counter++;
else if (char == ")")
counter--;
if (counter > max)
max = counter;
}
return max;
}
但不是两者。