递归--逆波兰表达式

Posted an-wl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归--逆波兰表达式相关的知识,希望对你有一定的参考价值。

用递归解决递归形式的问题
例题:逆波兰表达式
逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式) ,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。

输入:输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数

输出:输出为一行,表达式的值。

简单来说,这种表达式就是运算符号在全部在前面,需要运算的数值在后面,好像这种叫法是后缀表达式。
运算的原理是:从左往右走,如果某个运算符后面是连着2个数字的,那么计算其结果,然后再把其结果放在运算符的位置,参与运算的数移除,后面剩余的数字再往左移,依次类推,完成整个表达式的计算。

用递归解决递归形式的问题
样例输入
* + 11.0 12.0 + 24.0 35.0
样例输出
1357.000000
提示:(11.0+12.0)*(24.0+35.0)

python思想用了2种办法,第一种是利用栈的思想,一种是递归的思想。

"""
第一种解法,list列表从后往前读入数据
当数据是数字则加入栈,如果是运算符,则取出栈顶的前2个数字进行计算
然后再把计算结果存入栈顶,
后续依次规则进行,最后求出结果

def Exp(list):
    stackList = []
    for i in reversed(list):
        if (i == "+"):
           num = len(stackList)
           newValue = float(stackList[num-1]) + float(stackList[num-2])
           stackList.pop()
           stackList.pop()
           stackList.append(newValue)
        elif (i == "-"):
            num = len(stackList)
            newValue = float(stackList[num - 2]) - float(stackList[num - 1])
            stackList.pop()
            stackList.pop()
            stackList.append(newValue)
        elif (i == "*"):
            num = len(stackList)
            newValue = float(stackList[num-1]) * float(stackList[num-2])
            stackList.pop()
            stackList.pop()
            stackList.append(newValue)
        elif (i == "/"):
            num = len(stackList)
            newValue = float(stackList[num - 2]) / float(stackList[num - 1])
            del stackList[-1]
            del stackList[-1]
            stackList.append(newValue)
        else:
            stackList.append(i)
    print(stackList[0])


def main():
    print("请输入需要求解的波兰表达式(前缀):",end="")
    calculateList = []
    calculateList = input().strip().split(" ")
    Exp(calculateList)
"""
#第二种解法:利用函数递归调用实现

calculateList = []
#逐位遍历list列表,每次读入1个字符
pos = -1
def Exp():
    global pos
    pos = pos +1
    chr = calculateList[pos]
    if (chr == "+"):
        return Exp() + Exp()
    elif (chr == "-"):
        return Exp() - Exp()
    elif (chr == "*"):
        return Exp() * Exp()
    elif (chr == "/"):
        return Exp() / Exp()
    else:
        return float(chr)
def main():
    print("请输入需要求解的波兰表达式(前缀):", end="")
    global calculateList
    calculateList = input().strip().split(" ")
    result = Exp()
    print("计算结果为:%f"%result)

if __name__ == "__main__":
    main()

 

以上是关于递归--逆波兰表达式的主要内容,如果未能解决你的问题,请参考以下文章

逆波兰表达式(栈,递归)

逆波兰表达式

北京大学 程序设计与算法逆波兰表达式

算法与数据结构--栈的应用-逆波兰计算器完整版代码

C语言 逆波兰表达式 算法

1198:逆波兰表达式