下载此文档

2021年递归递推测试题分析讲解.ppt


文档分类:IT计算机 | 页数:约15页 举报非法文档有奖
1/15
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/15 下载此文档
文档列表 文档介绍
分析
解题思路:
这个问题看上去有些复杂,如果只是简单地模拟计算步骤不太容易想清楚,但是如果用递归的思想就非常容易想清楚,让我们根据逆波兰表达式的定义进行递归求解。在这个递归函数中,针对当前的输入,有五种情况:
1、输入是常数,则表达式的值就是这个常数
2、输入的是‘ + ’,则表达式的值是再继续读入两个表达式并计算出它们的值
3、输入的是‘ - ’;
4、输入的是‘ * ’;
5、输入的是‘ / ’;
后面几种情况与2相同,只是计算从‘ + ’变成‘ - ’ ‘ * ’ ‘ / ’。
1
递归递推测试题分析讲解
2021/1/15
#include <>
#include<>
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);
}
2
递归递推测试题分析讲解
2021/1/15
实现中常见的问题
问题一:
不适应递归的思路,直接分析输入的字符串,试图自己写进栈出栈的程序,写得逻辑复杂,因考虑不周出错。
问题二:
不会使用atof()函数,自己处理浮点数的读入,逻辑复杂出错。
3
递归递推测试题分析讲解
2021/1/15
放苹果
问题描述:
把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
4
递归递推测试题分析讲解
2021/1/15
解题思路:
1、所有不同的摆放方法可以分为两类:至少有一个盘子空着和所有的盘子都不空。我们可以分别计算这两类摆放方法的数目,然后把它们加起来。对于至少空着一个盘子的情况,则N个盘子摆放M个苹果的摆放数目与N-1个盘子摆放M个苹果的摆放方法数目相同。对于所有盘子都不空的情况,则N个盘子摆放M个苹果的摆放方法数目等于N个盘子摆放M-N个苹果的摆放方法数目。我们可以据此来用递归的方法求解这个问题。
2、设f(m,n)为m个苹果,n个盘子的放法数目,则先对n作讨论,如果n>m,必定有n-m个盘子永远空着,去掉它们对摆放苹果放法数目不产生影响;即if(n>m)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(n>m)return f(m,m);
return f(m,n-1)+f(m-n,n)}
3、出口条件说明:当n=1是,所有苹果都必须放到一个盘子里,所有返回1,当没有苹果可放时,定义为1种放法。递归的两条路,第一条n会逐渐减少,终会达到出口n==1;第二条m会逐渐减少,因为n>m时,我们会return f(m,m)所以终会到达出口m==0.
5
递归递推测试题分析讲解
2021/1/15
#include <>
int count(int x,int y){

2021年递归递推测试题分析讲解 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数15
  • 收藏数0 收藏
  • 顶次数0
  • 上传人书犹药也
  • 文件大小50 KB
  • 时间2021-01-15
最近更新