Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115373
  • 博文数量: 15
  • 博客积分: 152
  • 博客等级: 入伍新兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-29 17:10
文章分类

全部博文(15)

文章存档

2017年(1)

2015年(1)

2013年(8)

2012年(5)

分类: Python/Ruby

2013-12-15 15:23:01


点击(此处)折叠或打开

  1. def arrange(items, n = None):
  2.     length = len(items) #计算items的长度备用
  3.     n = n == None and length or n
  4.     if n == 0:
  5.         yield items[0:0]
  6.         #使用切片方法是为了返回与items一样的类型,items为列表,则返回列表,items为元组,则返回元组,items为字符串,则返回字符串
  7.     else:
  8.         for i in range(length):
  9.             h, items = items[:1], items[1:]
  10.             for e in arrange(items, n-1):
  11.                 yield h + e #递归,依次将每一个元素放在第一位。
  12.             items += h #将已经放在第一位的元素放在最后一位

  13. def combinate(items, n = None):
  14.     length = len(items)
  15.     n = n == None and length or n
  16.     if n == 0:
  17.         yield items[0:0]
  18.     else:
  19.         for i in range(length):
  20.             h, items = items[:1], items[1:]
  21.             for e in combinate(items, n-1):
  22.             #每一个元素依次与其后的元素进行组合,这是与排列的重要区别,排列是每一个元素依次与其它元素的排列进行合并
  23.                 yield h + e
  24.             #已经参与过组合的元素不再需要参与后序的组合,由次可见排列与组合的代码只有这一行不一样,神奇。


  25. for i in arrange(list('abc'), 3):
  26.     print(i)

  27. print('~~~~~~~~~~~~~~~~~~~~~')

  28. for i in combinate('abcde', 3):
  29.     print(i)


阅读(1874) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~