子集、组合、排列算法


列出所有 1...n 的子集
from pprint import pprint as print

def subsets(n):
    assert(n >= 0)
    s = []
    r = []

    def h(n):
        if n == 0:
            r.append(s[:])
        else:
            s.append(n)
            h(n - 1)
            del s[-1]
            h(n - 1)

    h(n)
    return r

print(subsets(3))

输出

[[3, 2, 1], [3, 2], [3, 1], [3], [2, 1], [2], [1], []]

从 1...n 选 m 个数,列出所有组合
from pprint import pprint as print

def combinations(n, m):
    assert(n >= 0 and m >= 0)
    c = []
    r = []

    def h(n, m):
        if n >= m:
            if m == 0:
                r.append(c[:])
            else:
                c.append(n)
                h(n - 1, m - 1)
                del c[-1]
                h(n - 1, m)

    h(n, m)
    return r

print(combinations(5, 3))

输出

[[5, 4, 3],
 [5, 4, 2],
 [5, 4, 1],
 [5, 3, 2],
 [5, 3, 1],
 [5, 2, 1],
 [4, 3, 2],
 [4, 3, 1],
 [4, 2, 1],
 [3, 2, 1]]

从 1...n 选 m 个数,列出所有排列
from pprint import pprint as print

def permutations(n, m):
    assert(n >= 0 and m >= 0)
    p = []
    r = []

    def h(n, m):
        if m == 0:
            r.append(p[:])
        else:
            for i in range(1, n + 1):
                if not i in p:
                    p.append(i)
                    h(n, m - 1)
                    del p[-1]

    h(n, m)
    return r

print(permutations(5, 2))

输出

[[1, 2],
 [1, 3],
 [1, 4],
 [1, 5],
 [2, 1],
 [2, 3],
 [2, 4],
 [2, 5],
 [3, 1],
 [3, 2],
 [3, 4],
 [3, 5],
 [4, 1],
 [4, 2],
 [4, 3],
 [4, 5],
 [5, 1],
 [5, 2],
 [5, 3],
 [5, 4]]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,022评论 6 13
  • 排列组合的定义 排列的定义:从n个不同元素中,任意取m个元素,m≤n且m和n都是自然数,按照一定顺序排成一列,叫做...
    伍帆阅读 10,668评论 6 10
  • 众筹具有注重创意的特征,许多大学生又颇具创新意识,校园众筹逐渐成为大学生实现创业梦想的重要方式。国外的校园众筹Al...
    周金城阅读 4,075评论 0 0
  • 背景 最近做一项目,公司数据库用的主从结构,以前做项目都只是用的单数据库,网上扒了两天,终于搞定自认为最优雅的方式...
    小李子Levy阅读 8,070评论 1 2
  • 生平少年日,分手易前期。 及尔同衰暮,非复别离时。 勿言一樽酒,明日难重持。 梦中不识路,何以慰相思。 我想 ...
    那加阅读 4,294评论 0 5

友情链接更多精彩内容