检查字符串是否与括号

时间:2018-01-14 21:47:33

标签: python string debugging recursion

我必须编写Python补充函数:

def find(searched, open)

用于递归检查输入字符串是否具有平衡括号的函数:

def balanced (text):
    #....
    return find(text, None)[1]

我不能使用堆栈。我必须包括选项,当输入字符串为空时,括号打开和关闭时(和一个小提示,不是每个结束括号我们应该反应相同)并包括对括号以外的字符的反应。 补充功能必须返回未处理的文本和以前的结果。

我有代码,对于我发现的每个例子都很遗憾:

PAIRS = {'(' : ')', '[' : ']'}

def balanced(text):
    #supp. f.
    def find(searched, open):         
        if not searched:
            return "", open is None
        rest, val = find(searched[1:], searched[0])
        if searched[0] in PAIRS.keys():
            return find(rest, open)
        elif searched[0] in PAIRS.values():
            if val is False:
                return rest, False
            elif open is not None and searched[0] == PAIRS [open]:
                return searched[1:], True
        else:
            return find(searched[1:], open)    
    return find(text, None)

if __name__ == '__main__':
    print("No string: ")
    print(balanced(""))
    print("########################")
    print("-----abc: ")
    print(balanced("abc"))
    print("########################")
    print("-----(a): ")
    print(balanced("(a)"))
    print("########################")
    print("-----)a(: ")
    print(balanced(")a("))
    print("########################")
    print("-----((a): ")
    print(balanced("((a)"))
    print("########################")
    print("-----((a(: ")
    print(balanced("((a("))
    print("########################")
    print("-----))a): ")
    print(balanced("))a)"))
    print("########################")
    print("-----()(a): ")
    print(balanced("()(a)"))
    print("########################")
    print("-----a(a): ")
    print(balanced("a(a)"))

在测试中,

中会返回错误的答案
((a)

((a(

我尝试使用来自 pythontutor.com pdb 和在线可视化调试器,但是我无法将递归包装在那里......那里的棘手情况是这也是Parson的谜题,我不能用不同的方式写出来。

我哪里出错?

2 个答案:

答案 0 :(得分:0)

这会得到您正在寻找的结果:

<强>代码

CASES = ["", 'abc', '(a)', ')a(', '((a)', '((a(', '))a)', '()(a)', 'a(a)' ]

left_pairs  = ['(','[']
right_pairs = [')',']']

def balanced(case):
    count = 0
    for char in left_pairs:
        count += case.count(char)
    for char in right_pairs:
        count -= case.count(char)

    if count == 0 or count % 1:
        return True
    else:
        return False

for case in CASES:
    print(str(balanced(case)) + "  " + case)

<强>返回

True  
True  abc
True  (a)
True  )a(
False  ((a)
False  ((a(
False  ))a)
True  ()(a)
True  a(a)

答案 1 :(得分:0)

我在朋友的帮助下找到了正确的答案,命令的顺序错了,一些意图也不在正确的位置。

我发现这段代码难以阅读且使用起来太复杂,尽管可能是那里的挑战。 带堆栈的版本对我来说更为普遍。

未来用户有工作版本:

PAIRS = {'(' : ')', '[' : ']'}

def balanced(text):
#supp. f.
def find(searched, open):         
    if not searched:
        return "", open is None
    if searched[0] in PAIRS.keys():
        rest, val = find(searched[1:], searched[0])
        if val is False:
            return rest, False
        return find(rest, open)  
    elif open is not None and searched[0] == PAIRS[open]:
        return searched[1:], True
    elif searched[0] in PAIRS.values():
        return searched[1:], False
    else:
        return find(searched[1:], open)
return find(text, None)