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

时间:2016-11-05 23:54:04

标签: 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

我只是需要帮助解释正在发生的事情,在这一部分:

  

排列(head [0:i] + head [i + 1:],tail + head [i])

1 个答案:

答案 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的索引,所以:

  • head [0:i]是""
  • head [i + 1:]是' y'
  • tail is""
  • head [i]是' x'

只有可能的参数yx的组合(置换)是xy。

第二次迭代,参数值为(x,y),因为i是y的索引,所以:

  • head [0:i]是' x'
  • head [i + 1:]是""
  • 尾巴是""
  • head [i]是' y'

只有可能的参数xy的组合(置换)是yx。