使用回溯的Python排列

时间:2017-08-18 18:36:04

标签: python backtracking

我只是想尝试使用回溯来学习排列。我已经编写了以下代码,但在第一次输出后停止了。

def permutations(str_in, soFar):

    if len(str_in) != 0:
        for c in str_in:
            soFar.append(c)
            temp_str = str_in
            temp_str.remove(c)
            print temp_str, soFar
            permutations(temp_str, soFar)
    else:
        print soFar

inp = "ABCD"        
str_in = list(inp)
permutations(str_in, [])

这是我得到的输出:

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

我确信这很简单,但我无法理解我在这里犯的错误。

2 个答案:

答案 0 :(得分:1)

以下是Bhavya Jain的Geeksforgeeks方法,用于排列字符串。代码中缺少的逻辑是子列表上的递归步骤和交换行为。这是他们的可视化。

Geeksforgeeks visualization of recursive steps

def permute(a, l, r):
    if l==r:
        print toString(a)
    else:
        for i in xrange(l,r+1):
            a[l], a[i] = a[i], a[l]
            permute(a, l+1, r)
            a[l], a[i] = a[i], a[l] # backtrack

# Driver program to test the above function
string = "ABC"
n = len(string)
a = list(string)
permute(a, 0, n-1)

输出

['A', 'B', 'C']
['A', 'C', 'B']
['B', 'A', 'C']
['B', 'C', 'A']
['C', 'B', 'A']
['C', 'A', 'B']

答案 1 :(得分:0)

我再次重写了它,并且在中间有一些打印命令,我能够达到所需的输出。但仍然不完全确定它的工作方式。我认为这主要是python如何在每次调用函数时修改列表。我不得不两次分配临时列表,以确保在追溯原始列表时不会修改。无论如何,以下代码正在运行。

def permute(String, SoFar):
    TempString = list(String)
    TempSoFar = list(SoFar)
    #print TempString, TempSoFar
    if TempString != []:
        for c in String:
            TStr = list(TempString)
            TSF = list(TempSoFar)
            TStr.remove(c)
            TSF.append(c)
            #print String, TStr, TSF
            permute(TStr, TSF)
    else:
        print "\nOut: ", TempSoFar, "\n"

permute(list("ABCD"),list(""))

使用字符串而不是列表的第二种解决方案,如下面的评论中所述。

def permute(String, SoFar):
    #print "New Func Call: ", "SoFar: ", SoFar,"String: ", String, "\n"
    if String != "":
        for c in String:
            TS = String.replace(c,"")
            TSF = SoFar+c
            permute(TS, TSF)
            #print "A Call Finished", "SoFar: ", SoFar,"String: ", String, "TSF: ", TSF, "TS: ", TS
    else:
        print SoFar

permute("ABC","")