回溯置换列表

时间:2015-01-03 19:37:39

标签: python algorithm backtracking

我试图置换一个列表,但我不能这样做,它会无限循环。我尝试了不同的东西,但不知怎的,它告诉我的唯一的事情是1 2 3 ... 1 2 3等

这是代码:

def prints(v,k):
    s = ''
    for i in range(k + 1):
        s += str(v[i]) + ' '
    print(s)   

def continuare(v,k):
    ok = True
    for i in range(k):
        if v[i] == v[k]:
            ok = False
            break
    return ok

def back(v,a):
    k = 0
    caut = False
    while k>-1:
        caut = False        
        pos = 0
        while pos < len(a) and caut == False:
                v[k] = a[pos]
                pos += 1
                if continuare(v,k):
                    caut = True
        if caut == False:
            k -= 1
        elif k == len(a) - 1:
            prints(v,k)
        else:
            k += 1


a = [1,2,3]
v = []
for x in range(len(a)):
    v.append(a[0])
back(v,a)

1 个答案:

答案 0 :(得分:1)

这是来自http://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/的简单Python转录:

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

def permute(a, i, n):
    if i == n:
        print(a)
        return
    for j in range(i, n+1):
        swap(a, i, j)
        permute(a, i+1, n)
        swap(a, i, j)  # backtrack

def main():
    a = list('ABC')
    permute(a, 0, 2)

if __name__ == '__main__':
    main()

我宁愿permute成为一个产生排列的生成器,main循环并打印它们,但这可能更接近C原始,因此更容易跟随。请注意,一个区别是必须的:这里列出的是列表,而不是C原文中的字符串,因为字符串在Python中是不可变的(因此swap需要截然不同的逻辑,返回“带有交换的字符串”字符“而不是像”回溯“逻辑所要求的那样在原地工作。)