【问题标题】:Calculator to basic operations with recursion in python计算器到python中的递归基本操作
【发布时间】:2018-12-23 23:12:16
【问题描述】:

我正在努力解决这个递归问题。我想用递归为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)

你能帮忙吗?

【问题讨论】:

  • i 永远不会等于 tuple。而是使用type(i) != tuple
  • 你也不需要循环。你可以检查type(expr[0]) != tuple
  • 但是如果expr[0] 不是tupleexpr[2] 是,这仍然行不通,因为在这种情况下你永远不会评估expr[2]

标签: python recursion tuples


【解决方案1】:

你基本上是在写一个二叉树遍历,特别是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.:代码未经测试,如果它不起作用,请告知。

【讨论】:

  • 在快速目视检查时,它不能工作,因为calculate(expr) 接受一个参数,但最后一行用两个参数调用它:(calculate(expr[0], expr[2])。括号不平衡。我猜你想要:(calculate(expr[0]), calculate(expr[2]))
  • 是的,我错过了。我在帖子中修复了代码。谢谢。
【解决方案2】:

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

几个迫在眉睫的问题:

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

  • 您永远不会评估操作的参数

这将导致您的代码执行:

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

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

【讨论】:

    【解决方案3】:

    您的评估逻辑已关闭——鉴于这些简单的表达式,我们实际上只关心两种情况,元组或非元组。如果它是一个元组,我们将嵌入的二元运算符应用于对两个参数的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
    >
    

    我相信,如果你尝试用这个简单的代码做一些更复杂的事情,你很快就会遇到问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多