我有这段代码,它充当递归函数,它只打印出字符串的所有可能组合:
def permut(head, tail = ''):
if len(head) == 0:
print(tail)
else:
for i in range(len(head)):
# Need help explaning this part
permut(head[0:i] + head[i+1:], tail + head[i])
# Print the string
permut('xy')
这将打印出:
xy
yx
我只需要帮助解释这部分发生的事情:
permutations(head[0:i] + head[i+1:], tail + head[i])
最佳答案
打印报表是您的 friend !由于 head 为“xy”,两个字符长,您期望函数的 for 循环“循环”两次(每个字符一次)。
在第一次迭代中,为了找到可能的字符组合,您正在调用(我认为是内置函数)两个参数的排列,第一个参数是 head[0:i] + head[i+1 :]。如果您还记得列表切片的工作原理(在本例中,在作为字符列表的字符串上),您可以从第一个索引到但不包括第二个索引进行切片。 head[0:i] 此时从 'x' 到不包括 'x',表示空字符串。它与 head[i+1:] 连接 (+),head[i+1:] 是“x”的索引 (0) 加 1,直到字符列表的末尾,表示从索引 1 开始,表示“y”。因此,你的第一个参数是“y”。第二个参数是 tail (空字符串)+ head[i] (即“x”。 您的第一个“循环”使用参数 (y, x) 调用排列。
在第二次迭代中,head[0:i] 是从索引 0 到但不包括 i(此时索引 1 处的“y”),因此是“x”。由于 i 现在是 y 在 xy 中的索引,此时 head[i + 1:] 是 head[2:],因此 head[2:] 没有值(它是一个空字符串)。因此,x 与空字符串连接意味着第一个参数只是“x”。 tail 仍然是一个空字符串,而 head[i] 是“y”,因此第二个参数是“y”。 您的第二个“循环”使用参数 (x, y) 调用排列。
使用 (y, x) 排列(第一个循环)的唯一其他可能的字符组合是首先打印的 xy。 类似地,使用 (x, y) 排列(第二次循环)的唯一其他可能的字符组合是第二个打印的内容 yx。
简单回答:
第一次迭代,参数值为(y, x),因为i是x的索引,所以:
- head[0:i] 是“”
- head[i+1:] 是“y”
- 尾部是“”
- head[i] 是“x”
参数 yx 的唯一可能的组合(排列)是 xy。
第二次迭代,参数值为(x, y),因为i是y的索引,所以:
- head[0:i] 是“x”
- head[i+1:] 是“”
- 尾部是“”
- head[i] 是“y”
参数 xy 的唯一可能的组合(排列)是 yx。
关于python - 需要伪代码和代码的解释 - Python 3+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40444559/