python - 需要伪代码和代码的解释 - Python 3+

标签 python python-3.x recursion pseudocode

我有这段代码,它充当递归函数,它只打印出字符串的所有可能组合:

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/

相关文章:

python - Python 对象是否在内部存储为字典?

python - 在Python中解压字典列表

c++ - 递归函数返回的字符串是否超出范围?

python - 发生异常 : 's3.ServiceResource' object has no attribute 'head_object'

python - 在 Python 3 中操作嵌套字典/列表树

python - 无法在pycharm上导入tensorflow

java - Java 中的这段递归 lambda 调用是如何工作的

python - 一起调试boost暴露的Python和C++

python - 如何在调用 API 时避免或跳过 python 中的错误 400

python - 递归 Python 快速排序中的变量作用域