java递归分苹果_递归应用示例(放苹果)[较难 选听]

ok,下面我们再看一个例子。 这个例子呢比较有意思。 这个例子名字叫放苹果。这是open jar 的上面比较经典的一道题目。 我们来看一下这个题目。说啊,有M个同样的苹果。 这M个苹果呢一模一样没有区别。现在呢要把这M个苹果 放在N个同样的盘子里头。 也就是说有N个一模一样的盘子,现在呢我们 要把这M个苹果放到这N个盘子里头。 而且呢你喜欢怎么放都行。允许有的盘子空着不放。 它允许可以你有空的盘子不放。他问你啊 请问一共有多少种不同的 分法或者放法? 也就是说要把这M个一模一样的苹果放到N个一模一样的盘子上 并且呢允许有的盘子空着不放。 请问有多少种放置方法? 在这呢它特别给了一个提示,也就是说这个放置方法 跟顺序是没关系的,也就比方说如果你有7个苹果3个盘子 你第一个放5个,第二放1个,第三个放1个。 这种放法其实跟第一个放1个,第二放5个,第三个放1个是 同一种分法,也就是说跟顺序排列顺序没有关系。 也就是说这个题目提给我们的问题就是 当我们有M个一模一样的苹果要放入N个一模一样的盘子里头的时候 有多少种放法? 这儿有一个输入输出的例子,比方说有7个苹果 3个盘子的时候那么它放法的总数就是8。 也就是说程序的输出应该是8。那对于这样一个问题我们应该怎么去求解呢? ok 我们啊仍然采用刚才使用过的那个办法。 现在我们假设 存在这样一个函数f(m,n),它能告诉我们答案。 也就是说我假设f(m,n)能告诉我们当m个苹果 放到n个盘子里的时候有多少种的解决方案。 那么接下来呢我们就来分析一下f(m,n)的执行过程。 也就是说我们假设存在这样一个函数它能告诉我结果。 那么在有这样一个假设的前提下呢我们去分析一下 这个函数是如何来进行计算的。 那怎么进行分析呢? 那么对于这样一个问题我们就可以分情况来讨论。 比方说我们可以这么来做。 首先我们来分析一下当盘子的数目 多于苹果数目的时候可能出现的情况。 比方说我们现在面临的状况是这样的。 我们一共有1234567,7个苹果。 但是摆在我们面前呢有9个一样的盘子。 现在呢盘子的数目比苹果的数目要多。 那么现在我们就要考虑一下了,既然 盘子的数目比苹果的数目还要多,那就意味着 就算每个盘子里头只放一个苹果。 比方说这儿有9个盘子,就算每个盘子里头只放 一个苹果也总会有两个盘子是 空着的。 也就是说这两个空着的盘子其实跟放苹果办法那个放法的数目 是完全没有关系的。 也就是说在这种情况下当盘子的数目比苹果的数目 还要多的时候我们完全可以把多余的盘子给 砍掉。让它消失掉。 那么进行这样一个转换砍掉多余的盘子呢完全不会影响我们最终的计算结果。 于是呢我们就得到了第一个规律。 也就是说如果n大于m这个条件成立的话 那么其实在这种情况下f(m,n)其实就等于 f(m,m)是不是这个意思啊?因为多余的盘子是完全用不着的。 这是我们得到的第一个结论。 那么接下来呢我们再去分析另外 一种情况。也就是说当苹果的数目 大于或者等于盘子的数目的时候会是什么样的状况? 比方法说现在我们有1,2,3,4,5,6,7,8,9,10

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值