递归课堂案例

一个不知名大学生,江湖人称菜狗
original author: Jacky Li
Email : 3435673055@qq.com

Time of completion:2024.03.24
Last edited: 2024.03.24

目录

递归课堂案例

第1关:斐波那契数列

任务描述

相关知识

编程要求

代码如下:

第2关:阿克曼函数

任务描述

相关知识

编程要求

代码如下:

第3关:排列问题

任务描述

编程要求

输入输出

代码如下:

第4关:整数划分问题

任务描述

编程要求

输入输出

代码如下:

第5关:汉诺塔问题

任务描述

输入输出


递归课堂案例

第1关:斐波那契数列

任务描述

本关需要你用递归函数实现斐波那契数列。

相关知识

斐波那契数列公式为:

F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)

编程要求

请用递归函数实现斐波那契数列,在主函数中调用该递归函数,输出第n项的值。

效果如下:

输入:3 输出:2


开始你的任务吧,祝你成功!

代码如下:

#include <iostream>
using namespace std;
int F(int n)
{
    if(n == 1 || n == 2) return 1;
    else return F(n - 1) + F(n - 2);

}
int main()
{
   int n;
   cin >> n;
   cout << F(n);
   return 0;
}

第2关:阿克曼函数

任务描述

本关需要你根据公式来编写一个递归函数的程序,且输出答案。

相关知识

编程要求

编写递归函数Acm(n,m)实现如下图所示的Acm函数,其中m、n为正整数。例如:Acm(2,1)=4,Acm(3,3)=16

输入nm两个整数,输出Acm(n,m)。如果n小于0或m小于0,则返回-1。

输入:2 1 输出:4


开始你的任务吧,祝你成功!

代码如下:

#include <iostream>
using namespace std;
int Acm(int m,int n)
{
    if(n < 0 || m < 0) return -1;
    if(m == 1 && n == 0) return 2;
    else if(m == 0) return 1;
    else if(n == 0) return m + 2;
    else return Acm(Acm(m - 1, n), n - 1);
}
int main()
{
    int m, n;
    cin >> m >> n;
    cout << Acm(m, n);
    return 0;
}

第3关:排列问题

任务描述

本关任务:设R={r1​,r2​,…rn​}是要进行排列的n个元素,Ri​=R−{ri​},集合X中元素的全排列记为Perm(X)(ri​)Perm(X)表示在全排列Perm(X)的每个排列前加上前缀ri​得到的排列。R的全排列可归纳定义如下:

  • n=1时,Perm(R)=(r),其中r是集合R中唯一元素;
  • n>1时,Perm(R)由 (r1​)Perm(R1​),(r2​)Perm(R2​),(r3​)Perm(R3​)...(rn​)Perm(Rn​)构成。

写出Perm(R)的递归算法。

编程要求

根据提示,在右侧编辑器补充代码。

输入输出

输入格式:一个正整数n,随后一行 n个字符(空格隔开) 输出格式:每种排列一行,以空格隔开(最后一个字符后也有一个空格) 平台会对你编写的代码进行测试,。

测试输入: 4 a b c d

预期输出:

a b c d

a b d c

a c b d

a c d b

a d c b

a d b c

b a c d

b a d c

b c a d

b c d a

b d c a

b d a c

c b a d

c b d a

c a b d

c a d b

c d a b

c d b a

d b c a

d b a c

d c b a

d c a b

d a c b

d a b c


开始你的任务吧,祝你成功!

代码如下:

#include<iostream>
using namespace std;
const int N = 100;

void swaps(char &a,char &b)//引用符号&是C++操作符,函数参数使用该符号将
{
  char c;
  c = a;
  a = b;
  b = c;
}

void perm(char item[], int k, int m)
{
    /*********Begin*********/
    if(k == m)
    {
      for(int i = 0; i <= m; i ++)
        cout << item[i] << ' ';
      cout << '\n';
    }
    for(int i = k; i <= m; i ++)
    {
      swaps(item[k], item[i]);
      perm(item, k + 1, m);
      swaps(item[k], item[i]);
    }

    /*********End**********/
}
int main()
{
  int n;
  char item[N];
  cin>>n;    
  for(int i = 0; i < n; i ++)cin>>item[i];
  perm(item,0,n-1);
   return 0;
}

第4关:整数划分问题

任务描述

任务描述:将正整数n表示成一系列正整数之和,n=n1​+n2​+⋯+nk​(n1​≥n2​≥…,≥nk​≥1,k≥1)正整数n的不同划分个数称为正整数n的划分数,记为p(n)。例如6有如下11种划分: 5+1;4+2,4+1+1;3+3,3+2,3+1+1;2+2+2,2+2+1+1,2+1+1+1+1;1+1+1+1+1+1p(6)=11 试求一个正整数n的划分数p(n)

编程要求

根据提示,在右侧编辑器补充代码。

输入输出

输入格式:一个正整数n 输出格式n划分数 测试输入:6 预期输出:11


开始你的任务吧,祝你成功!

代码如下:

#include<iostream>
using namespace std;
int q(int n,int m)
{
    if(n == 1 || m == 1)  return 1;
    else if(m == n)
        return q(n, n - 1) + 1;
    else if(m > n)
        return q(n, n);
    else
        return q(n, m - 1) + q(n-m, m);
}
int main()
{
    int n;
    cin>>n;   
    cout<<q(n,n);
    return 0;
}

第5关:汉诺塔问题

任务描述

本关任务:设a,b,c是三个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小叠在一起,各圆盘从小到大编号为1,2,…,n,如下图所示,现在要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样的顺序叠放。在移动圆盘时遵守以下移动规则:

  • 规则1:每次只能移动一个圆盘;
  • 规则II:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
  • 规则III:在满足移动规则I和II的前提下,可将圆盘移至a,b,c中任一塔座上。

输入输出

输入格式:一个证正整数表示圆盘个数n 输出格式:若干行,每行一次移动:盘号:起始塔座->目标塔座

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

测试输入:

3

预期输出:

1:a->b

2:a->c

1:b->c

3:a->b

1:c->a

2:c->b

1:a->b


开始你的任务吧,祝你成功!

#include<iostream>
using namespace std;


 void move(int n,char x,char  y)
 {
     printf("%d:%c->%c\n", n, x, y);
 }

 void hanoi(int n,char x,char y,char z)
 {
     if(n == 1) move(1, x, z);
     else
     {
        hanoi(n-1, x, z, y);
        move(n, x, z);
        hanoi(n-1, y, x, z);
     }

 }

 int main()
 {
    int n;
    char A='a',B = 'b',C='c';
    cin>>n;   
    hanoi(n,A,C,B);
     return 0;
 }

作者有言

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/484378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java每日一题——买啤酒(递归经典问题)

前言&#xff1a; 非常喜欢的一道题&#xff0c;经典中的经典。打好基础&#xff0c;daydayup!!!啤酒问题&#xff1a;一瓶啤酒2元&#xff0c;4个盖子可以换一瓶&#xff0c;2个空瓶可以换一瓶&#xff0c;请问10元可以喝几瓶 题目如下&#xff1a; 啤酒问题&#xff1a;一瓶…

学习笔记 | 微信小程序项目day03

今日学习内容 配置自定义导航栏通用轮播组件通用的轮播图组件完善以及主页调用分类面板以及热门推荐面板猜你喜欢模块&#xff08;分页查询&#xff09;首页下拉刷新首页骨架屏 配置自定义导航栏 1、创建自定义组件 /index/components/CustomNavbar.vue <script setup l…

关于使用TCP-S7协议读写西门子PLC字符串的问题

我们可以使用TCP-S7协议读写西门子PLC&#xff0c; 比如PLC中定义一个String[50] 的地址DB300.20 地址DB300.20 DB块编号为300&#xff0c;偏移量【地址】是30 S7协议是西门子PLC自定义的协议&#xff0c;默认端口102&#xff0c;本质仍然是TCP协议的一种具体实现&#xff…

ForceField Effects

支持HDRP、URP和LWRP 完全可定制和优化的ForceField VFX Pack。我们使所有着色器和材质都非常易于调整,因此您可以非常轻松地创建自己独特的效果。几乎每个参数都可以调整。所有这些效果都适合于每个游戏,无论是风格化还是现实主义的。该软件包还附带一系列颜色渐变,可用于更…

力扣-20 有效的括号详解 Java

目录 1.题目分析 2.基础知识储备 2.1 哈希表 2.2 栈的存取 3. 逻辑概要 4.源码 示例 1.题目分析 为了对比都是从内而外&#xff0c;一个个匹配&#xff0c;全部匹配成功即为有效字符 2.基础知识储备 2.1 哈希表 简单来说&#xff0c;keyvalue存储 &#xff0c;通过key…

ideaSSM 高校公寓交流员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 高校公寓交流管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&…

一篇文章搞懂并设计循环队列

目录 1.为什么使用循环队列 2. 循环队列组成 为什么要只使用size-1 个空间存储&#xff1f; 3.循环队列的元素进出 3.1 队尾加入元素 3.2 队头删除元素 3.3 取出队头元素 3.4 取出队尾元素 1.为什么使用循环队列 “假溢出”——》 出队列会空出存储空间&#xff0c;无法…

Gogs - 一款极易搭建的自助 Git 服务

Gogs - 一款极易搭建的自助 Git 服务 1. 使用文档References Gogs https://gogs.io/ https://github.com/gogs/gogs Gogs (/gɑgz/) 项目旨在打造一个以最简便的方式搭建简单、稳定和可扩展的自助 Git 服务。使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发&#xff0c;并…

模拟-算法

文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…

最近公共祖先(LCA)

祖孙询问 给定一棵包含 n 个节点的有根无向树&#xff0c;节点编号互不相同&#xff0c;但不一定是 1∼n。 有 m 个询问&#xff0c;每个询问给出了一对节点的编号 x 和 y&#xff0c;询问 x 与 y 的祖孙关系。 输入格式 输入第一行包括一个整数 表示节点个数&#xff1b; …

基于YOLOv8深度学习的橙子病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分类

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【MySQL】复合查询——基本单表查询、多表查询、自连接、子查询、使用from进行子查询、合并查询

文章目录 MySQL复合查询1. 基本单表查询2. 多表查询3. 自连接4. 子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 使用from进行子查询 5. 合并查询5.1 union5.2 union all MySQL 复合查询 数据库的复合查询是指在一个查询中结合使用多个查询条件或查询子句&#xff0c;以…

java多线程编程面试题总结

一些最基本的基础知识就不总结了&#xff0c;参考之前写的如下几篇博客&#xff0c;阅读顺序从上到下&#xff0c;依次递进。 java 多线程 多线程概述及其三种创建方式 线程的常用方法 java 线程安全问题 三种线程同步方案 线程通信&#xff08;了解&#xff09; java 线程池…

CSS案例-2.简单版侧边栏练习

效果 知识点 标签显示模式 块级元素 block-level 常见元素:<h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等。 特点: 独占一行长度、宽度、边距都可以控制宽度默认是容器(父级宽度)的100%是一个容器及盒子,里面可以放行内或者…

spring注解驱动系列--AOP探究二

上篇中记录了AnnotationAwareAspectJAutoProxyCreator的创建以及注册&#xff0c;主要是 1、EnableAspectJAutoProxy 注解会开启AOP功能 2、然后这个注解会往容器中注册一个AnnotationAwareAspectJAutoProxyCreator组件。 3、之后在容器创建过程中&#xff0c;注册后置处理器&a…

【免费】【随机优化】智能配电网的双时间尺度随机优化调度

目录 1 主要内容 2 部分代码 3 部分程序结果 4 下载链接 1 主要内容 该程序为文章《Two-Timescale Stochastic Dispatch of Smart Distribution Grids》的源代码&#xff0c;主要做的是主动配电网的双时间尺度随机优化调度&#xff0c;该模型考虑配电网的高效和安全运行涉及…

【大模型】在VS Code(Visual Studio Code)上安装中文汉化版插件

文章目录 一、下载安装二、配置显示语言&#xff08;一&#xff09;调出即将输入命令的搜索模式&#xff08;二&#xff09;在大于号后面输入&#xff1a;Configure Display Language&#xff08;三&#xff09;重启 三、总结 【运行系统】win 11 【本文解决的问题】 1、英文不…

【JS】如何避免输入中文拼音时触发input事件

现有一段代码&#xff0c;监听input事件。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" con…

GDC期间LayaAir启动全球化战略

3 月 18 日至 3 月 22 日&#xff0c;一年一度的游戏开发者大会&#xff08;GDC&#xff09;在美国旧金山举行。在此期间&#xff0c;Layabox宣布LayaAir引擎启动全球扩张战略&#xff0c;这标志着引擎将步入快速发展的新阶段。此举旨在利用公司先进的3D引擎技术&#xff0c;将…

mysql体系结构及主要文件

目录 1.mysql体系结构 2.数据库与数据库实例 3.物理存储结构​编辑 4.mysql主要文件 4.1数据库配置文件 4.2错误日志 4.3表结构定义文件 4.4慢查询日志 4.4.1慢查询相关参数 4.4.2慢查询参数默认值 4.4.3my.cnf中设置慢查询参数 4.4.4slow_query_log参数 4.4.…