使用递归实现整数全排列python

版权声明:本文为博主原创文章,转载请附上本博文链接。 https://blog.csdn.net/weixin_41704182/article/details/87933518

设计一个递归算法生成 n n 个元素{ r 1 r_{1} , r 2 r_{2} , r 3 r_{3} ,…, r n 1 r_{n-1} , r n r_{n} }的全排序

  • 算法讲解:

  • R = R= { r 1 r_{1} , r 2 r_{2} , r 3 r_{3} ,…, r n 1 r_{n-1} , r n r_{n} } 是要进行排列的n个元素, R i R_{i} = R R - r i {r_{i}}

  • 集合 X X 中元素的全排列记为 p e r m ( X ) perm(X)
    r i p e r m ( X ) {r_{i}}perm(X) 表示在全排列 p e r m ( X ) perm(X) 的每一个排列前加上前缀得到的排列。

  • R R 的全排列可归纳定义如下:
    1、当 n = 1 n=1 时, p e r m ( R ) = r perm(R)=r ,其中 r r 是集合 R R 中唯一的元素。
    2、当 n > 1 n>1 时, p e r m ( R ) perm(R) r 1 p e r m ( R 1 ) {r_{1}}perm(R_{1}) r 2 p e r m ( R 2 ) {r_{2}}perm(R_{2}) 、…、( r n p e r m ( R n ) {r_{n}}perm(R_{n}) 构成。

  • 实例:{1,2,3}的全排列可以分为3个子数组的全排列:

  • 1+{2,3}的全排列:123 132 表示list[1]和list[2]交换。

  • 2+{1,3}的全排列:213 231 表示list[0]和list[2]交换。

  • 3+{1,2}的全排列:312 321 表示list[0]和list[1]交换。

  • 代码如下

    #__author:linyingqing
    #data:2019/2/12
    def perm(list, begin):
     if begin >= len(list):
         print(list)
     else:
         i = begin
         for num in range(begin, len(list)):
             list[num], list[i] = list[i], list[num]
             perm(list, begin + 1)
             list[num], list[i] = list[i], list[num]
    
    if __name__ == "__main__":
        list = [1, 2, 3, 4]
        perm(list, 0)
    

猜你喜欢

转载自blog.csdn.net/weixin_41704182/article/details/87933518
今日推荐