我在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))")
答案 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
,因为在您的输入中,除了(|)
之外,其他字符似乎也会出现。