使用递归在python中进行基本运算的计算器

时间:2018-12-23 23:12:16

标签: python recursion tuples

我正在努力解决此递归问题。我想通过递归为python中的基本操作创建一个计算器。

ops = {"+": (lambda x,y: x+y), "-": (lambda x,y: x-y), "*": (lambda x,y: x*y)}

def calculator(expr):
   for i in expr:
       if type(i) != tuple:
           return (ops[expr[1]] (expr[0],expr[2]))
       else:
           return calculator((i))

对于calculator(((1, '+', 2), '*', 3)),我期望9,但我得到(1, '+', 2, 1, '+', 2, 1, '+', 2)

请您帮忙?

3 个答案:

答案 0 :(得分:0)

我不确定您是否会在此递归……

一些直接的问题:

  • i永远不会是tuple,但有时可能是其中一个的实例:您可以使用isinstance(i, tuple)

  • 进行检查
  • 您永远不会评估操作的参数

这将导致您的代码执行以下操作:

  1. calculator(((1, '+', 2), '*', 3))
  2. ops['*']((1, '+', 2), 3)
  3. (1, '+', 2) * 3

请注意,将listtuplen“相乘”将导致其元素重复n次-这就是您所看到的

答案 1 :(得分:0)

您基本上是在写遍历二叉树,特别是binary expression tree。使用元组是表示树的一种方法(尽管有更好的方法,例如实际上是implementing a binary tree)。

现在,关于您的代码。您的表达可以两种不同的形式出现:数字或元组。第一个只是一个简单的无聊数字。元组将用来表示更复杂的表达式。因为它是一棵二叉树,所以元组将始终具有三个元素。

以下代码应该可以使用。

#ops is defined as you defined it
def calculate(expr):
    if isinstance(expr, int): # this is the terminating condition for your recursion
        return expr
    if isinstance(expr, tuple):
        return ops[expr[1]](calculate(expr[0]), calculate(expr[2]))

代码将输出最终的整数结果。当然,您也可以使用其他数字类型(例如float)。对于在python中开始递归来说,这很好。

P.S .:代码未经测试,请告知代码是否无效。

答案 2 :(得分:0)

您的评估逻辑不正确-给出这些简单的表达式,我们实际上只关心两种情况,元组或不元组。如果是元组,则将嵌入式二进制运算符应用于两个参数上的calculator()的递归调用。如果不是元组,则按原样返回:

OPERATIONS = { \
    "+": (lambda x, y: x + y), \
    "-": (lambda x, y: x - y), \
    "*": (lambda x, y: x * y), \
}

def calculator(expr):
    if isinstance(expr, tuple):
        return OPERATIONS[expr[1]](calculator(expr[0]), calculator(expr[2]))

    return expr

print(calculator(((1, '+', 2), '*', 3)))

输出

> python3 test.py
9
>

我相信,如果您尝试使用此简单的代码执行更复杂的操作,则会很快遇到问题。