程序设计部分 函数的递归 第4关:使用递归进行自动分析

任务描述
本关任务:计算逆波兰表达式的值。

相关知识
放苹果问题
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?

注意:5,1,1和1,5,1 是同一种分法。

我们可以先假设有一个函数count(m,n)能告诉我们m个苹果放n个盘子有多少种放法,然后在此基础上进行分析:

根据m和n之间的关系,可以分成以下两种情况来讨论:

①. 如果m小于n,即苹果(m)数比盘子(n)数小,那么无论怎么放,总是会至少有n - m个空盘子。因此可以得到:count(m,n) = count(m,m)。

②. 如果m大于等于n,即苹果数比盘子数多,或者相同,则有两种放置方法:

所有盘子都要放苹果。这个时候苹果中的**n个的位置已经固定**,只要考虑剩下m-n个,因此可以得到:count(m,n) = count(m - n,n)。

有盘子不放苹果。在这种情况中,我们可以只考虑有一个盘子不放。因为在不断的往下递的过程中,盘子数可以不断的减一,隐含了在m个苹果放在n - 1 ,n - 2 ... 2 ,1个盘子中的情况。这个时候可以得到count(m,n) = count(m,n - 1)。

综合以上两点,可以得到代码:

int count(int m,int n)
{
    if(m < n)
        return count(m,m);
    else
        return count(m - n,n) + count(m,n - 1); //两种放置方法的和
}
现在还差一个终止条件。考虑盘子数或者苹果数各为1或者0时,有:

盘子数为0或者1,苹果无论有多少都只有一种分配方法。

苹果数为0或者1,无论如何都只能放在一个盘子里。

即得到:

if(m <=1 || n <=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值