需要伪代码和代码的解释 - Python 3+
Need explanation of Pseudocode and code - Python 3+
我有这段代码作为递归函数,它只打印出字符串的所有可能组合:
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])
打印报表是你的朋友! head 为 'xy',两个字符长,您希望函数的 for 循环到 'loop' 两次(每个字符一次)。
在第一次迭代中,为了找到可能的字符组合,您正在调用(我认为是 built-in 函数)两个参数的排列,第一个是 head[0:i] + head [i+1:]。如果您还记得列表切片是如何工作的(在本例中,在作为字符列表的字符串上),您可以从第一个索引到但不包括第二个索引进行切片。 head[0:i] 此时是从 'x' 到不包括 'x',意思是一个空字符串。这是将 (+) 与 head[i+1:] 连接起来,它是 'x' (0) 的索引加 1,直到字符列表的末尾,表示从索引 1 开始,表示 'y'.因此,您的第一个参数是 'y'。第二个参数是 tail(空字符串)+ head[i](即 'x'。
您的第一个 'loop' 调用带有参数 (y, x) 的排列。
在第二次迭代中,head[0:i] 从索引 0 开始但不包括 i('y' 此时位于索引 1),因此 'x'。由于 i 现在是 y 在 xy 中的索引,此时 head[i + 1:] 是 head[2:],没有值 head[2:](它是一个空字符串)。因此,x 与空字符串连接意味着第一个参数只是 'x'。 tail 仍然是一个空字符串,而 head[i] 是 'y',所以第二个参数是 'y'。
您的第二个 'loop' 调用带有参数 (x, y) 的排列。
唯一可能的字符组合,使用 (y, x) 的排列(您的第一个循环)是首先打印的字符 xy。
类似地,使用 (x, y) 的排列(您的第二个循环)的唯一其他可能的字符组合是第二个打印的内容,yx。
简单回答:
第一次迭代,参数值为(y, x),因为i是x的索引,所以:
- head[0:i] 是“”
- 头[i+1:]是'y'
- 尾巴是“”
- head[i] 是 'x'
参数 yx 的唯一可能组合(排列)是 xy。
第二次迭代,参数值为(x,y),因为i是y的索引,所以:
- head[0:i] 是 'x'
- 头[i+1:]是“”
- 尾巴是“”
- head[i] 是 'y'
参数 xy 的唯一可能组合(排列)是 yx。
我有这段代码作为递归函数,它只打印出字符串的所有可能组合:
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])
打印报表是你的朋友! head 为 'xy',两个字符长,您希望函数的 for 循环到 'loop' 两次(每个字符一次)。
在第一次迭代中,为了找到可能的字符组合,您正在调用(我认为是 built-in 函数)两个参数的排列,第一个是 head[0:i] + head [i+1:]。如果您还记得列表切片是如何工作的(在本例中,在作为字符列表的字符串上),您可以从第一个索引到但不包括第二个索引进行切片。 head[0:i] 此时是从 'x' 到不包括 'x',意思是一个空字符串。这是将 (+) 与 head[i+1:] 连接起来,它是 'x' (0) 的索引加 1,直到字符列表的末尾,表示从索引 1 开始,表示 'y'.因此,您的第一个参数是 'y'。第二个参数是 tail(空字符串)+ head[i](即 'x'。 您的第一个 'loop' 调用带有参数 (y, x) 的排列。
在第二次迭代中,head[0:i] 从索引 0 开始但不包括 i('y' 此时位于索引 1),因此 'x'。由于 i 现在是 y 在 xy 中的索引,此时 head[i + 1:] 是 head[2:],没有值 head[2:](它是一个空字符串)。因此,x 与空字符串连接意味着第一个参数只是 'x'。 tail 仍然是一个空字符串,而 head[i] 是 'y',所以第二个参数是 'y'。 您的第二个 'loop' 调用带有参数 (x, y) 的排列。
唯一可能的字符组合,使用 (y, x) 的排列(您的第一个循环)是首先打印的字符 xy。 类似地,使用 (x, y) 的排列(您的第二个循环)的唯一其他可能的字符组合是第二个打印的内容,yx。
简单回答:
第一次迭代,参数值为(y, x),因为i是x的索引,所以:
- head[0:i] 是“”
- 头[i+1:]是'y'
- 尾巴是“”
- head[i] 是 'x'
参数 yx 的唯一可能组合(排列)是 xy。
第二次迭代,参数值为(x,y),因为i是y的索引,所以:
- head[0:i] 是 'x'
- 头[i+1:]是“”
- 尾巴是“”
- head[i] 是 'y'
参数 xy 的唯一可能组合(排列)是 yx。