Python string.replace(c,';';,1))和string[1:]之间的差异

Python string.replace(c,';';,1))和string[1:]之间的差异,python,recursion,Python,Recursion,因此,我试图跟踪递归函数,但跟踪时遇到困难: 我试图追踪排列的代码,但这让我困惑: # doesn't work def permutations(string): if len(string) == 1: return string recursive_perms = [] for c in string: for perm in permutations(string[1:]): recursive_perms

因此,我试图跟踪递归函数,但跟踪时遇到困难:

我试图追踪排列的代码,但这让我困惑:

# doesn't work
def permutations(string):
    if len(string) == 1:
        return string

    recursive_perms = []
    for c in string:
        for perm in permutations(string[1:]):
            recursive_perms.append(c+perm)

    return set(recursive_perms)

# works
def permutations(string):
    if len(string) == 1:
        return string

    recursive_perms = []
    for c in string:
        for perm in permutations(string.replace(c,'',1)):
            recursive_perms.append(c+perm)

    return set(recursive_perms)
我现在很讨厌跟踪递归,我不知道第一个和第二个函数之间的区别,但是第二个可以工作,第一个不行。不同之处在于替换。替换字符串和执行字符串[1:]之间有什么不同?您是否可以将替换更改为字符串切片

str.replace(旧的,新的[,计数])
旧的
替换为
新的
,可选地仅用于第一个
计数
实例

str[1://code>返回从第二个索引处的字符到最后一个索引的
str
片段,有效地返回除第一个字符以外的整个字符串


当您调用
str[1:://code>时,实际发生的情况是,您正在调用
str.\uu getitem\uuuuuuuuuuuuu(切片(1,无))

第一个函数“不工作”是什么意思?它应该做什么,它实际上做什么?排列('abc')的期望输出是:{'abc','cba','bac','acb','bca','cab'}。起作用的函数是这样做的,不起作用的函数是:{'abc','acc','bcc','bbc','cbc','ccc'}注意
string[1:
切掉第一个字符,但是
c
并不总是第一个字符……为什么不直接使用
itertools.permutations
?练习递归