首页 > 编程语言 >程序设计部分 函数的递归 第4关:使用递归进行自动分析

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

时间:2024-08-07 13:23:17浏览次数:15  
标签:count return 函数 递归 int 苹果 exp 程序设计 盘子

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

相关知识
放苹果问题
把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 <= 1)
    return 1;
上下两段代码组合起来,就得到:

int count(int m,int n)
{
    if(m <=1 || n <= 1)
        return 1;
    if(m < n)
        return count(m,m);
    else
        return count(m - n,n) + count(m,n - 1); //两种放置方法的和
}
当我们输入2 2时,即count(2,2),得到的结果是:

2

即两种放法:每个盘子放一个苹果,或者两个苹果放在一个盘子里。

总的来说,利用递归进行自动分析的方法如下:

先假设有一个函数能给出答案。

再利用这个函数,分析如何解决问题。

搞清楚最简单的情况下答案是什么。

编程要求
逆波兰表达式是一种把运算符前置的算术表达式,如:

2 + 3的逆波兰表示法为+ 2 3。

(2 + 3) * 4的逆波兰表示法为* + 2 3 4。

现在请你编写一个程序,读取一段正确的逆波兰表达式,计算并输出它的结果。

输入的表达式中只有+ - * /四种运算符,且数字均为**1位,但是运算时要按照浮点数float**来运算。

请在右侧编辑器的Cal函数中,读取输入的逆波兰表达式,计算并输出结果,占一行。

输入数据需要学员自己读取。具体见测试说明。

测试说明
平台会对你编写的代码进行测试:

预期输入:+ 2 3
预期输出:5

预期输入:* + 2 3 4
预期输出:20


参考代码:

#include <iostream>

#include <cstdlib>

using namespace std;
/**********   Begin   **********/

//可以在此增加其他函数
float exp() {
  char s[20];
  cin >> s;
  switch (s[0]) {
    case '+':
      return exp() + exp();
    case '-':
      return exp() - exp();
    case '*':
      return exp() * exp();
    case '/':
      return exp() / exp();
    default:
      return atof(s);
  }
}
void Cal() {
  //在此补充代码完成函数功能
  cout << exp() << endl;

}
/**********   End   **********/

标签:count,return,函数,递归,int,苹果,exp,程序设计,盘子
From: https://blog.csdn.net/Whovian_Z/article/details/140964410

相关文章

  • 《重生到现代之从零开始的C语言生活》——函数递归
    递归啥是递归啊递归是解决问的一种方式,简单来说,就是函数自己调用自己递归解决问题把复杂的大问题转化为一个一个与原文题相似的小问题。递归的思想就是把大事化小在递归中,递就是递推,归就是回归递归中的限制条件递归必须存在限制条件,当满足这个条件时,递归不在继续每次......
  • 超详细明了的C语言函数递归,望周知。(包含求n的阶乘顺序打印⼀个整数的每⼀位求第n个斐
    1.递归是什么?递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢?递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。写⼀个史上最简单的C语⾔递归代码#include<stdio.h>intmain(){printf......
  • Java程序设计:Java IO(2)
    目录1实验名称2实验目的3实验源代码4实验运行结果图5总结1实验名称   JavaIO2实验目的    继续熟练掌握在eclipse中调试代码    掌握Java IO中流的基本概念及使用方法    掌握文件锁、Scanner解析文件的使用方法3实验源代......
  • Java程序设计:Java IO
    目录1实验名称2实验目的3实验源代码4实验运行结果图5总结1实验名称   JavaIO2实验目的    继续熟练掌握在IDEA中调试代码    掌握File类的基本使用    掌握Java IO中流的基本概念及使用方法    掌握文件IO流、缓冲流......
  • pb函数库之字符串操作函数
    Fill()功能建立一个由指定字符串填充的指定长度的字符串。语法Fill(chars,n)参数chars:string类型,指定用于重复填充的字符串n:long类型,指定由该函数返回的字符串的长度返回值String。函数执行成功时返回n个字符的字符串,该字符串以参数chars中的字符串重复填充而成。如果参数c......
  • 猫头虎分享 Python 知识点:pandas--info()函数用法
    ......
  • Python 内联函数最佳实践
    如果我有一个可以用一行表示的python函数,那么以下哪一个选项通常被认为最适合可读性和一般最佳实践?或者还有其他更好的选择吗?选项2对我来说似乎是最好的,但我是初学者,所以我不想假设任何事情。我尝试过搜索PEP8、StackOverflow和一两个博客,但我找不到任何关于python的明......
  • 二叉树递归解决问题刷题 (一)
    遇到和深度相关的题目,可以用dfs递归遍历深度获取bfs结果来做513.找树左下角的值如何找二叉树最底层最左边节点的值呢,就是dfs遍历深度,来获取,最后一层的第一个元素就是。classSolution:def__init__(self):#记录二叉树的最大深度self.maxDepth=......
  • 函数的作用域
    函数的递归调用递归调用的含义:在一个函数中,直接或者间接调用了函数本身称之为函数的递归调用。递归调用的本质:  是一种循环结构,它不同于之前所学的while,do-while,for这样的循环结构,这些循环结构是借助循环变量,而递归是利用函数自身实现循环结构,如果不加以控制,很容易产......
  • Python 中的生成器函数有什么作用及如何使用?
    生成器函数是一种特殊的函数,可以在迭代过程中动态生成值,而不是一次性返回所有值。它的作用有以下几点:节省内存:生成器函数一次只生成一个值,并在生成后立即释放内存,这样可以减小内存的占用,特别是在处理大数据集时非常有用。延迟计算:生成器函数可以按需生成值,只在需要的时......