在if语句

时间:2018-04-15 12:57:16

标签: python recursion backtracking

我有这段代码

def swap(a, i, j):
    a[i], a[j] = a[j], a[i]


def permute(a, i, n):
    if (a == b):
        print('String matched')
    else:
        if i == n:
            print(a)
        for j in range(i, n + 1):
            swap(a, i, j)
            permute(a, i + 1, n)
            swap(a, i, j)


def main():

    string = "ABCD"
    n = len(string)
    a = list(string)
    global b
    b = list("ABDC")
    permute(a, 0, n - 1)


if __name__ == '__main__':
    main()

我的目标是在字符串匹配字符串b时停止循环,但程序输出是

['A', 'B', 'C', 'D']
String matched
['A', 'C', 'B', 'D']
['A', 'C', 'D', 'B']
['A', 'D', 'C', 'B']
['A', 'D', 'B', 'C']
['B', 'A', 'C', 'D']
['B', 'A', 'D', 'C']
['B', 'C', 'A', 'D']
['B', 'C', 'D', 'A']
['B', 'D', 'C', 'A']
['B', 'D', 'A', 'C']
['C', 'B', 'A', 'D']
['C', 'B', 'D', 'A']
['C', 'A', 'B', 'D']
['C', 'A', 'D', 'B']
['C', 'D', 'A', 'B']
['C', 'D', 'B', 'A']
['D', 'B', 'C', 'A']
['D', 'B', 'A', 'C']
['D', 'C', 'B', 'A']
['D', 'C', 'A', 'B']
['D', 'A', 'C', 'B']
['D', 'A', 'B', 'C']

Process finished with exit code 0

正如我们所看到的,“String matched”正在替换匹配的字符串(这意味着if条件正在工作)。我的问题是,之后循环仍然有效。

接下来尝试:将return false放入if语句。不幸的是,输出仍然是相同的

有谁知道如何停止循环?

2 个答案:

答案 0 :(得分:0)

您可以添加其他变量。

例如:

def swap(a, i, j):
    a[i], a[j] = a[j], a[i]


def permute(a, i, n):
    if (a == b):
        global flag
        flag = True
        print('String matched')
    elif not flag:
        if i == n:
            print(a)
        for j in range(i, n + 1):
            swap(a, i, j)
            permute(a, i + 1, n)
            swap(a, i, j)


def main():

    string = "ABCD"
    n = len(string)
    a = list(string)
    global flag
    global b
    flag = False
    b = list("ABDC")
    permute(a, 0, n - 1)


if __name__ == '__main__':
    main()

答案 1 :(得分:0)

因为您以递归方式调用permute()函数,所以再次调用该函数的先前调用仍在运行。像上一个答案一样使用全局布尔变量可能是最简单的解决方案。