我有这个代码作为递归函数,只打印出字符串的所有可能组合:
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
我只是需要帮助解释正在发生的事情,在这一部分:
排列(head [0:i] + head [i + 1:],tail + head [i])
答案 0 :(得分:1)
打印报表是你的朋友!由于头部是' xy'两个字符长,你希望你的功能循环到'循环'通过两次(每个角色一次)。
在第一次迭代中,为了找到可能的字符组合,你在两个参数上调用(我认为是内置函数)排列,第一个是head [0:i] + head [i + 1 :]。如果您还记得列表切片的工作原理(在这种情况下,对于作为字符列表的字符串),您可以从第一个索引切片到但不包括第二个索引。 head [0:i]此时来自' x'最多但不包括' x',表示空字符串。这是与头[i + 1:]连接的(+),它是' x'的索引。 (0)加1,直到字符列表的末尾,意思是从索引1开始,意思是' y'。因此,你的第一个论点就是' y'。第二个参数是tail(空字符串)+ head [i](这是' x'。 你的第一个循环'用参数调用排列(y,x)。
在第二次迭代中,head [0:i]是从索引0到但不包括i(此时在索引1处为' y')因此' x' 。由于我现在是xy中y的索引,此时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的索引,所以:
只有可能的参数yx的组合(置换)是xy。
第二次迭代,参数值为(x,y),因为i是y的索引,所以:
只有可能的参数xy的组合(置换)是yx。