- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归递推与测试题分析讲解
逆波兰表达式 问题描述: 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2+3的逆波兰表示法为+23。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2+3)*4的逆波兰表示法为*+234。本题求解逆波兰表达式的值,其中运算符包括+- * / 四个。 输入数据: 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。 输出要求: 输出为一行,表达式的值 输入样例: * + 11.0 12.0 + 24.0 35.0 输出样例: 1357.000000 分析 解题思路: 这个问题看上去有些复杂,如果只是简单地模拟计算步骤不太容易想清楚,但是如果用递归的思想就非常容易想清楚,让我们根据逆波兰表达式的定义进行递归求解。在这个递归函数中,针对当前的输入,有五种情况: 1、输入是常数,则表达式的值就是这个常数 2、输入的是‘ + ’,则表达式的值是再继续读入两个表达式并计算出它们的值 3、输入的是‘ - ’; 4、输入的是‘ * ’; 5、输入的是‘ / ’; 后面几种情况与2相同,只是计算从‘ + ’变成‘ - ’ ‘ * ’ ‘ / ’。 #include stdio.h #includemath.h double exp(){ char a[10]; scanf(“%s”,a); switch(a[0]){ case’+’:return exp()+exp(); case’-’:return exp()-exp(); case’*’:return exp()*exp(); case’/’:return exp()/exp(); default:return atof(a); } } void main() { double ans; ans=exp(); printf(“%f”,ans); } 实现中常见的问题 问题一: 不适应递归的思路,直接分析输入的字符串,试图自己写进栈出栈的程序,写得逻辑复杂,因考虑不周出错。 问题二: 不会使用atof()函数,自己处理浮点数的读入,逻辑复杂出错。 放苹果 问题描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的放法?(用K表示)注意:5,1,1和1,5,1是同一种分法。 输入数据 第一行是测试数据的数目t(0=t=20),以下每行均包含两个整数M和N,以空格分开。 1=M,N=10。 输出要求 对输入的每组数据M和N,用一行输出相应的K。 输入样例 1 7 3 输出样例 8 解题思路: 1、所有不同的摆放方法可以分为两类:至少有一个盘子空着和所有的盘子都不空。我们可以分别计算这两类摆放方法的数目,然后把它们加起来。对于至少空着一个盘子的情况,则N个盘子摆放M个苹果的摆放数目与N-1个盘子摆放M个苹果的摆放方法数目相同。对于所有盘子都不空的情况,则N个盘子摆放M个苹果的摆放方法数目等于N个盘子摆放M-N个苹果的摆放方法数目。我们可以据此来用递归的方法求解这个问题。 2、设f(m,n)为m个苹果,n个盘子的放法数目,则先对n作讨论,如果nm,必定有n-m个盘子永远空着,去掉它们对摆放苹果放法数目不产生影响;即if(nm)f(m,n)=f{m,m}。当n=m时,不同的方法可以分为两类:即有至少一个盘子空着或者所有盘子都有苹果,前一种情况相当于f(m,n)=f(m,n-1);后一种情况可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n)=f(m-n,n)。总的放苹果的放法数目等于两者的和,即f(m,n)=f(m,n-1)+ f(m-n,n)。整个递归过程描述如下: int f(int m,int n){ if(n==1||m==0)return 1; if(nm)return f(m,m); return f(m,n-1)+f(m-n,n)} 3、出口条件说明:当n=1是,所有苹果都必须放到一个盘子里,所有返回1,当没有苹果可放时,定义为1种放法。递归的两条
文档评论(0)