python 排列组合算法_Python 进阶之递归(二)排列组合

大家好,我是一只初入编程坑的生物狗。在学习python的过程中整理了一下自己的资料分享给大家,同是小白的朋友们可以拿来练习,提升自信(如果我这只笨笨的生物狗都可以编代码的话你萌也木问题的!)肯定有很多不足的地方,也麻烦大家指出好帮助我进步!

记得教授用递归演示排列组合时,对着code连发三声感叹:"Beautiful!" "Amazing!" "Elegant!"

我也很激动啊,只是当我尝试自己写的时候......

好啦不废话了。自认为组合(combination)简单点,就先从它开始吧。它的实质就是我们上一节说到的分叉的思想(选它,或者不选)

不怕大家说我傻,知道我看到code第一个困惑是什么吗?---为什么没有return????这就是分叉树递归的神奇之处了,如果你在base condition那里return,你会惊讶地发现它只return了整个大树的一个树枝哦!那么问题来了,如果我暂时不想print出这些结果怎么办?好办,再加一个参数——一个空的list,把每个结果储存起来。

来一道简单的练习:

练习一:A,B,C,D,E和F去做志愿,但是人家只需要三个人。A只想和B一起去(但是B不一定非得和A一起去)。C 和D是仇人见面就打架不能一起去。请列出所有可能性。

先把所有组合都得到,再用另一个function筛去不符合条件的。这种简单直接的方法可不是在哪都适用哦,给定数组很大的话你会在recursion无底洞中体会深深的恐惧(这个我们后面还会细说)...

练习二:(模仿俄罗斯套娃)你有一屋子的纸箱子(一个list,里面存储着每个箱子的长宽高的值e.g.[(1,3,2),(2,5,6),(3,4,8)...]),你想把他们收拾好以尽量腾出更多的空间。于是你想把大小箱子套在一起,长宽高都较小的箱子可以放进长宽高都较大的箱子里面。写一段code来得到最多能把哪些箱子套到一起:

这里就注意了,如果先不管箱子大小,把所有组合都求出来.....会报recursion error的,没报的话...就是箱子不够多> <所以我们要试图在combination的function中就把条件限定出来。原代码很长,这里不全po出来。Hint:把装所有箱子的list先sort一下,这样从最小的开始,如果最小的可以放进后一个稍大的箱子,你可以选择放或者不放,依次类推。为什么要选择放与不放呢?因为list是按照其中每个tuple中第一个数值(在这个问题中我们假设是箱子的长)的大小来排序的,但是长度短不代表它高度或宽度也短,所以很可能影响后面放更多的箱子!

私以为组合比排列要好理解很多,所以下一节要整理排列啦!算法中有不对或者很笨的地方也请大家多多指教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值