【发布时间】:2016-04-16 05:26:59
【问题描述】:
下面的代码创建了一个计算器,它记住了所有的操作数和运算符。“Evaluate”函数接受一个 Ops 数组并返回一个包含结果和剩余操作的元组。但我无法理解 switch 发生了什么.
如果情况是 opStack 有 4,x,5,+,6 最后一个元素 6 被删除并检查,在 switch 中。由于它是一个操作数,它将返回 6(操作数)和其余的元素 4,x,5,+。
我的理解正确吗? "6" 和 "4,x,5,+" 去哪里了,整个表达式如何计算?
private enum Op {
case Operand (Double)
case UnaryOperation(String , Double -> Double)
case BinaryOperation(String , (Double,Double) -> Double)
}
private var opStack = [Op]()
private var knownOps = [String : Op]()
init() {
knownOps["×"] = Op.BinaryOperation("×" , *)
knownOps["÷"] = Op.BinaryOperation("÷" ){ $1 / $0 }
knownOps["+"] = Op.BinaryOperation("+" , +)
knownOps["−"] = Op.BinaryOperation("−" ){ $1 - $0 }
knownOps["√"] = Op.UnaryOperation("√" ,sqrt)
}
private func evaluate( ops : [Op]) -> (result : Double? , remainingOps: [Op]){
if !ops.isEmpty {
var remainingOps = ops
let op = remainingOps.removeLast()
switch op{
case .Operand(let operand):
return (operand , remainingOps)
case .UnaryOperation( _ , let operation):
let operandEvaluation = evaluate(remainingOps)
if let operand = operandEvaluation.result{
return ( operation(operand), operandEvaluation.remainingOps) }
}
case .BinaryOperation(_, let operation):
let op1Evaluation = evaluate(remainingOps)
if let operand1 = op1Evaluation.result {
let op2Evaluation = evaluate(op1Evaluation.remainingOps)
if let operand2 = op2Evaluation.result {
return (operation(operand1, operand2), op2Evaluation.remainingOps)
}
}
}
}
return(nil , ops)
}
【问题讨论】:
-
函数是递归的;请注意
UnaryOperation和BinaryOperation案例调用evaluate。您可以设置断点并单步执行该函数以查看它是如何工作的,但是当您说操作数堆栈中有4,x,5,+,6时,我怀疑您是不正确的。看起来它会有两个操作“4x5”和“+6”
标签: ios swift recursion switch-statement return