我有一个计算机程序,它读入一个字符数组,即用后缀表示法编写的操作数和运算符。然后程序扫描数组,通过使用堆栈计算结果,如下所示:
get next char in array until there are no more
if char is operand
push operand into stack
if char is operator
a = pop from stack
b = pop from stack
perform operation using a and b as arguments
push result
result = pop from stack
如何通过归纳证明此程序正确评估任何后缀表达式? (摘自练习4.16 Java中的算法(Sedgewick 2003))
答案 0 :(得分:5)
我不确定您需要哪些表达式来证明该算法。但如果它们看起来像典型的RPN表达式,则需要建立如下内容:
1) algoritm works for 2 operands (and one operator) and algorithm works for 3 operands (and 2 operators) ==> that would be your base case 2) if algorithm works for n operands (and n-1 operators) then it would have to work for n+1 operands. ==> that would be the inductive part of the proof祝你好运; - )
关注数学证据,以及有时令人困惑的名字。在归纳证明的情况下,仍然需要“弄清楚”某事(某些事实或某些规则),有时候是通过演绎逻辑,但随后这些事实和规则拼凑起来构成一个更广泛的真理,购买归纳;那就是:因为基本情况被建立为真,并且因为一个证明如果X对于“n”情况是真的那么X对于“n + 1”情况也是如此,那么我们不需要尝试每一个案例,这可能是一个很大的数字,甚至是无限的)
回到基于堆栈的表达式评估器......一个最后的提示(除了Captain Segfault的优秀解释之外,你会感到过度了解......)。
The RPN expressions are such that: - they have one fewer operator than operand - they never provide an operator when the stack has fewer than 2 operands in it (if they didn;t this would be the equivalent of an unbalanced parenthesis situation in a plain expression, i.e. a invalid expression).
假设表达式有效(因此不会过早提供太多运算符),操作数/运算符输入算法的顺序无关紧要;他们总是让系统处于稳定的状态: - 在堆栈上有一个额外的操作数(但知道最终会有一个额外的操作数)或者 - 堆栈中只有少一个操作数(但是知道操作数仍然会减少一个)。
所以顺序并不重要。
答案 1 :(得分:0)
你知道归纳是什么吗?你经常看到算法是如何工作的吗? (即使你还不能证明它?)
你的归纳假设应该说,在处理第N个字符后,堆栈是“正确的”。完整RPN表达式的“正确”堆栈只有一个元素(答案)。对于部分RPN表达式,堆栈有几个元素。
然后您的证据就是将此算法(减去结果=来自堆栈行的弹出)视为将部分 RPN表达式转换为堆栈的解析器,并证明它将它们转换为正确的堆栈
查看RPN表达式的定义并向后工作可能会有所帮助。