Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用递归打印字符串的排序排列_Python_Algorithm_Sorting_Recursion - Fatal编程技术网

如何在python中使用递归打印字符串的排序排列

如何在python中使用递归打印字符串的排序排列,python,algorithm,sorting,recursion,Python,Algorithm,Sorting,Recursion,我想以排序的方式打印字符串的排列。我不允许使用itertools,我必须使用递归 这是我为此目的创建的代码,但它非常慢,因为打印所有答案需要200秒才能打印出10个字符!我想加快速度,在10秒内完成。有什么帮助吗 n = int(input()) # n is the number of characters 1 <= n <= 10 elements0 = str(input()) # it will be in this format : A B C D E F G ele

我想以排序的方式打印字符串的排列。我不允许使用itertools,我必须使用递归

这是我为此目的创建的代码,但它非常慢,因为打印所有答案需要200秒才能打印出10个字符!我想加快速度,在10秒内完成。有什么帮助吗

n = int(input()) # n is the number of characters

1 <= n <= 10

elements0 = str(input()) # it will be in this format : A B C D E F G

elements = elements0.split()

def translate(elements) :
    i = 0
    while i < n :
        elements[i] = int(i)
        i = i + 1
    return elements

elements = translate(elements)

def factor(elements,i):
    elements = elements[:]
    if i == len(elements) - 1:
        list.append(elements)
        return elements
    else:
        for j in range(i,len(elements)):
            elements[i], elements[j] = elements[j], elements[i]
            factor(elements, i + 1)
            elements[i], elements[j] = elements[j], elements[i]

list = []

factor(elements,0)

list = sorted(list)

def untranslate(list,n) :
    from math import factorial
    i = 0
    while i < factorial(n) :
        k = 0
        while k < n :
            if list[i][k] == 0 :
                list[i][k] = elements0[0]
            if list[i][k] == 1 :
                list[i][k] = elements0[2]
            if list[i][k] == 2 :
                list[i][k] = elements0[4]
            if list[i][k] == 3 :
                list[i][k] = elements0[6]
            if list[i][k] == 4 :
                list[i][k] = elements0[8]
            if list[i][k] == 5 :
                list[i][k] = elements0[10]
            if list[i][k] == 6 :
                list[i][k] = elements0[12]
            if list[i][k] == 7 :
                list[i][k] = elements0[14]
            if list[i][k] == 8 :
                list[i][k] = elements0[16]
            if list[i][k] == 9 :
                list[i][k] = elements0[18]
            k = k + 1
        i = i + 1
    return list

list = untranslate(list,n)



while True :
    if list == [] : break
    else:
        i=0
        row = str()
        while i < n :
            row = row + str(list[0][i])
            i = i + 1
        list.pop(0)

        print(row) # This should be in this format : ABCDEFG
n=int(input())#n是字符数

1好吧,既然这是家庭作业,我可以给你一个版本,这个版本与你想要实现的略有不同

记住,在递归中,需要两件事:

  • 基本情况
  • 相信你的功能,它将解决除基本情况以外的所有问题
  • 这是密码

    def getPermutations(string):
        if len(string) == 1: # Base Case
            return [string]
        else:                # Not base case
            result = []
            for i in range(len(string)):
                candidate = string[i]
                remaining = string[0:i] + string[i+1:]
                babies = getPermutations(remaining)  # Faith!
                for word in babies:
                    result.append(candidate + word)
            return result
    
    “ABCD”绝对不需要200秒。代码是自文档化的,因此您应该能够了解这里正在做什么

    这是一个运行示例

    >>> myPerms = sorted( getPermutations("ABC") )
    >>> for p in myPerms: print p
    ... 
    ABC
    ACB
    BAC
    BCA
    CAB
    CBA
    

    请注意,如果字符串有重复的条目(例如“AABC”),则此操作不起作用。祝你的家庭作业好运

    @e-satis是的,兄弟。你是怎么得到它的你在课堂上听并读这本书。@TimTisdall我发布了我写的代码。我想这意味着我知道一些事情。但问题是,我不知道如何编写一个更好的代码。他很诚实,工作很努力。这篇文章写得很好,没有理由不帮忙。对不起。我在这里看到的所有家庭作业问题都让我厌倦了“1.基本情况2.相信你的函数能解决”@e-satis什么?整件事都是我干的吗?我应该没有吗?对于一个家庭作业问题,最好给点建议,而不是一开始就给出全部答案。一旦OP解决了这个问题,你就可以用干净的版本更新你的版本,这样可以帮助其他人。这没什么大不了的,但你下次会知道的。@e-satis好吧,我必须承认我对rep的贪婪影响了我在这里的判断。从现在起我会记住你说的话。抱歉。@user3015255很高兴听到事情进展顺利打印p
    只是为了显示列表中的内容。如果希望以不同的方式打印单词,可以使用自己的不同for循环。玩一下代码,看看什么最有效。