放苹果

放苹果

http://www.nowcoder.com/questionTerminal/bfd8234bb5e84be0b493656e390bdebf

采用递归的思想将此事件无限细分,每个事件可以分为f(m,n)=f(m-n,n)+f(m,n-1);f(m-n,n)是当苹果数大于等于盘子数的情况,f(m,n-1)是当苹果数小于盘子数的情况。当此事件分到苹果数为0或苹果数为1或盘子数为1的时候返回1,当苹果数小于0或盘子数小于等于0返回0.

import java.util.Scanner;
public class Main{
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNextInt())
        {
            System.out.println(count(sc.nextInt(),sc.nextInt()));
        }
        sc.close();
    }
    public static int count(int m,int n)
    {
        if(m<0||n<=0)
           return 0;
        //细分到苹果数为一或盘子数为一的情况返回一
        if(m==1||n==1||m==0)
            return 1;
        //将此事件无线细分
        return count(m,n-1)+count(m-n,n);
    }
}
全部评论
作者的解释有点苍白。 递归的核心是递进和回归,递进就是要逐渐减小问题规模,回归要保证有出口(或称base case)。如何减小问题规模呢?m个苹果放进n个盘子,求不同放法的种数,可以分为两类情况:1.让每个盘子都有苹果放着。2.至少有一个盘子空着。有且仅有这两种情况,两种情况没有交集。7个苹果放进3个盘子,共有8种不同放法,可以用此实例加深以上理解。现在,用f(m,n)表示将m个苹果放进n个盘子不同放法的种数。第一种情况相当于给每个盘子先发1个苹果,再将m-n个苹果放进n个盘子里,不同放法种数为f(m-n,n)。第二种情况相当于摒弃掉空着的那个盘子,将m个苹果放进n-1个盘子里,不同放法种数为f(m,n-1)。因此,f(m,n) = f(m-n,n)+f(m,n-1)。至此,问题规模已经减小了,再结合递归出口,就可以完成求解了。
68 回复 分享
发布于 2022-10-09 22:40 浙江
这样解释: 所有情况分为func(m,n) = 没有一个盘子是空盘子的情况func(m-n,n) + 至少有一个盘子是空盘子的情况func(m,n-1)
8 回复 分享
发布于 2022-09-13 11:39 浙江
看不懂?
1 回复 分享
发布于 2022-05-28 15:53
牛逼啊 这个函数没用过
1 回复 分享
发布于 2022-06-11 15:51
是怎么想到的这种解法,太奇妙了
1 回复 分享
发布于 05-17 07:25 北京
没点数学基础真做不出来
1 回复 分享
发布于 10-23 18:42 广东
请问这是哪路神仙?
点赞 回复 分享
发布于 2022-03-24 21:01
重入神仙之境,剑来
点赞 回复 分享
发布于 2022-04-07 19:38
很酷的想法,赞
点赞 回复 分享
发布于 2022-05-08 16:20
仙人指路
点赞 回复 分享
发布于 2022-05-14 17:42
牛逼
点赞 回复 分享
发布于 2022-06-25 21:23
大佬,有个问题我想问一下,递归最后一个return返回为什么要这样子写?帮帮孩子叭...
点赞 回复 分享
发布于 2022-08-01 14:35

相关推荐

鼗:四级有点难绷,感觉能拿国家励志奖学金,学习能力应该蛮强的,四级确实不重要,但是拿这个卡你可是很恶心啊
点赞 评论 收藏
分享
115 26 评论
分享
牛客网
牛客企业服务