Python中数组求和的递归程序

时间:2018-03-08 04:14:07

标签: python recursion parentheses

我在Python中编写了以下程序,它应该只使用递归来输出括号的数量是否为偶数。例如:

nestParen("(())") --> true

nestParen("(((x))") --> false

以下是我的程序中的代码。出于某种原因,它总是返回true。为什么这个以及如何解决?谢谢!

def nestParen(string1, max = 0, min = 0): 

    if max == 0:
        max = len(string1) - 1
    checker = False
    if max > min:
        if string1[max] == ")" and string1[min] == "(":
            checker = True
            min = min + 1
            max = max - 1
            if max > min:
                nestParen(string1, max, min)
                print checker
    return checker
nestParen("(((x))")

1 个答案:

答案 0 :(得分:0)

列表可能最适合跟踪您当前看到的括号数。此外,更容易创建令牌系统以便于识别。最后,将每个字符串强制转换为iter,因此,通过使用next,您可以更轻松地确定是否已完成对字符串的迭代:

import re
import collections
test = ["(())", "(((x))"]
def tokenize():
   token = collections.namedtuple('token', ['type', 'value'])
   token_results = [re.findall('\(|\)|\w+', i) for i in test]
   token_types = {'OPAREN':'\(', 'CPAREN':'\)', 'VAR':'\w+'}
   return [iter(token([a for a, b in token_types.items() if re.findall(b, c)][0], c) for c in i) for i in token_results]


def nestParen(s, current = []):
   checking = next(s, None)
   if not checking and current:
       return False
   if not checking and not current:
       return True
   if checking.type == 'OPAREN':
      return nestParen(s, current+[checking.value])
   if checking.type == 'CPAREN':
      if not current:
        return False
      val = current.pop()
      return nestParen(s, current)
   if checking.type not in ['CPAREN', 'OPAREN']:
      return nestParen(s, current)

final_results = map(nestParen, tokenize())
print(final_results)

输出:

[True, False]

虽然标记化系统使程序比其他更多算法版本更长,但有助于清楚地创建一种方法,通过该方法标记和计算输入字符串中的每个字符。从长远来看,这会缩短nestParen,因为在您的输入中,除了(|)之外,其他字符似乎也会出现。