zoukankan      html  css  js  c++  java
  • 全排列

    step 1: 列表的全排列:

    这个版本比较low

    def permutation(li,index):
        for i in range(index,len(li)):
            if index == len(li)-1:
                print(li)
                return
            tmp = li[index]
            li[index] = li[i]
            li[i] = tmp
            permutation(li,index+1)
            tmp = li[index]
            li[index] = li[i]
            li[i] = tmp

    调用:

    permutation([1,2,3,4],0)

    step2: 字符串的全排列:

    def permutation(str):
        li = list(str)
        cnt = 0  #记录全排列的总数
        def permutation_list(index):
            if index == len(li) -1:
                nonlocal cnt
                cnt += 1
                print(li)
            for i in range(index,len(li)):
                li[index],li[i] = li[i],li[index]
                permutation_list(index+1)
                li[index], li[i] = li[i], li[index]
    
        ret = permutation_list(0)
        print("共有%d中全排列" % cnt)
        return ret

    备注:

    在闭包中,内部函数依然维持了外部函数中自由变量的引用—单元。内部函数不能修改单元对象的值(但是可以引用)。若尝试修改,则解释器会认为它是局部变量。这类似于全局变量和局部变量的关系。如果在函数内部修改全局变量,必须加上global声明,但是对于自由变量,尚没有类似的机制。所以,只能使用列表。(python3中引入了关键字:nonlocal)

    测试:

    permutation('abcd')

    ['a', 'b', 'c', 'd']
    ['a', 'b', 'd', 'c']
    ['a', 'c', 'b', 'd']
    ['a', 'c', 'd', 'b']
    ['a', 'd', 'c', 'b']
    ['a', 'd', 'b', 'c']
    ['b', 'a', 'c', 'd']
    ['b', 'a', 'd', 'c']
    ['b', 'c', 'a', 'd']
    ['b', 'c', 'd', 'a']
    ['b', 'd', 'c', 'a']
    ['b', 'd', 'a', 'c']
    ['c', 'b', 'a', 'd']
    ['c', 'b', 'd', 'a']
    ['c', 'a', 'b', 'd']
    ['c', 'a', 'd', 'b']
    ['c', 'd', 'a', 'b']
    ['c', 'd', 'b', 'a']
    ['d', 'b', 'c', 'a']
    ['d', 'b', 'a', 'c']
    ['d', 'c', 'b', 'a']
    ['d', 'c', 'a', 'b']
    ['d', 'a', 'c', 'b']
    ['d', 'a', 'b', 'c']
    共有24中全排列

    step3 : 使用python标准库

    import itertools
    t = list(itertools.permutations([1,2,3,4]))
    print(t)

    可以指定排列的位数:

    import itertools
    t = itertools.permutations([1,2,3,4],3) #只排列3位
  • 相关阅读:
    MVC 【Razor 视图引擎】基础操作 --页面跳转,传值,表单提交
    MVC 【ASPX视图引擎】
    js弹出对话框的方法总结
    MVC 基础
    [转]C#中Split用法~
    对话框控件延伸文本框制作
    WinForm LIstView
    WinForm多窗体间操作
    WinForm 控件ComboBox数据绑定
    WinForm布局
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6681275.html
Copyright © 2011-2022 走看看