递归算法c++

主页:(*´∇`*) 咦,又好了~ xiaocr_blog

算法概述:递归算法是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。

算法实质:递归算法就是将原问题不断分解为规模缩小的子问题,然后递归调用方法来表示问题的解。(用同一个方法去解决规模不同的问题)

算法思想:递归算法,顾名思义就是有两个大的阶段:递和归,即就是有去(递去)有回(归来)。

算法设计要素:

  • 明确递归的终止条件
  • 提取重复的逻辑,缩小问题的规模不断递去
  • 给出递归终止时的处理办法


·例题1:简单累和

#include<bits/stdc++.h>
using namespace std;
int get_sum(int n) {if (n == 1) {return 1;}return get_sum(n - 1) + n;
}
int main() {int n;cin >> n;cout << "Sum=" << get_sum(n) << endl;return 0;
}

·例题2:设有n个数已经按从小到大的顺序排列,现在输入x,判断它是否在这n个数中,如果存在则输出“YES",否则输出”NO“

#include<bits/stdc++.h>
using namespace std;
int a[101], k;
void search(int a[], int left, int right) {if(left<right){int mid = (left + right) / 2;if (a[mid] == k) { cout << "YES"; return; }else if (k < a[mid]) { search(a, mid + 1, right); }else{ search(a, left, mid); }}else {cout << "NO" << endl;}
}
int main() {int n;cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];}search(a, 1, n);return 0;
}

·例题3:Hanoi汉诺塔问题

#include<bits/stdc++.h>
using namespace std;
void move(char pos1, char pos2) {printf("%c-->%c", pos1, pos2);
}
void Hanoi(int n, char pos1, char pos2, char pos3) {if (n == 1) {move(pos1, pos3);cout << "\n";}else {Hanoi(n - 1, pos1, pos3, pos2);move(pos1, pos3);cout << "\n";Hanoi(n - 1, pos2, pos1, pos3);}}
int main() {int n;cin >> n;Hanoi(n, 'A', 'B', 'C');return 0;
}


·例题4:斐波那契数列

#include<bits/stdc++.h>
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;
}


·例题五:集合的划分

描述

设S是一个具有n个元素的集合,S=〈a1,a2,……,an〉,现将S划分成 k 个满足下列条件的子集合S1,S2,……,Sk,且满足:

1.Si≠∅

2.Si∩Sj=∅ ( 1≤i,j≤k,i≠j )

3.S1∪S2∪S3∪…∪Sk=S

则称S1,S2,……,Sk是集合S的一个划分。它相当于把S集合中的n个元素a1,a2,……,an放入k个(0<k≤n<30)无标号的盒子中,使得没有一个盒子为空。请你确定n个元素a1,a2,……,an 放入k个无标号盒子中去的划分数S(n,k)。

【输入】

给出n和k。

【输出】

n个元素a1,a2,……,an 放入k个无标号盒子中去的划分数S(n,k)。

#include<bits/stdc++.h>
using namespace std;
int S(int n, int k) {if (n < k || k == 0) { return 0; }if (k == 1 || k == n) { return 1; }return (S(n - 1, k - 1) + k * S(n - 1, k));
}int main() {int n, k;cin >> n >> k;cout << S(n, k);return 0;
}

·例题六:数的计数

描述

我们要求找出具有下列性质数的个数(包括输入的自然数n)。先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理:

不作任何处理;

在它的左边加上一个自然数,但该自然数不能超过原数的一半;

加上数后,继续按此规则进行处理,直到不能再加自然数为止。

#include<bits/stdc++.h>
using namespace std;
int ans;
void f(int n) {ans++;for (int i = 1; i <= n/2; i++) {f(i);}
}
int main() {int n;cin >> n;f(n);cout << ans;return 0;
}


习题:

全排列

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。

我们假设对于小写字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。

【输入】

只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

【输出】

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:

已知S=s1s2...sk,T=t1t2...tkS=s1s2...sk,T=t1t2...tk,则S<T等价于,存在p(1<=p<=k),使得s1=t1,s2=t2,...,sp−1=tp−1,sp<tps1=t1,s2=t2,...,sp−1=tp−1,sp<tp成立。

#include<bits/stdc++.h>
using namespace std;
char a[10], ans[10];
bool v[10];
int len;
void f(int pos) {if (pos == len) { for (int i = 0; i < len; i++) {cout << ans[i];}cout << endl;return; }else {for (int i = 0; i < len; i++) {if(v[i]==0){v[i] = 1;ans[pos] = a[i];f(pos + 1);v[i] = 0;}}}
}
int main() {cin >> a;len = strlen(a);f(0);return 0;
}

分解因数

题目描述】给出一个正整数aa,要求分解成若干个正整数的乘积,即a=a1×a2×a3×...×an,并且1<a1≤a2≤a3≤...≤an,问这样的分解的种数有多少。注意到a=a也是一种分解。

#include<bits/stdc++.h>
using namespace std;
int a,n,ans;
void f(int a, int k) {if (k >= a) { return; }for (int i = k; i <= a / i; i++) {if (a % i == 0) {ans++;f(a / i, i);}}
}
int main() {cin>> n;//n代表测试组数while (n--) {cin >> a;ans = 1;f(a, 2);cout << ans << endl;}return 0;
}

pell数列

【题目描述】

Pell数列a1,a2,a3,...的定义是这样的,a1=1,a2=2,...,an=2an−1+an−2(n>2)。

给出一个正整数 k,要求Pell数列的第 k项模上 32767

是多少。

【输入】

第1行是测试数据的组数 n,后面跟着 n行输入。每组测试数据占 1行,包括一个正整数k(1≤k<1000000)。

#include<bits/stdc++.h>
using namespace std;
int pell(long long  n) {if (n == 1) { return 1; }if (n == 2) { return 2; }return (2 * pell(n - 1) + pell(n - 2));
}
int main() {int n;cin >> n;while(n--){int k;cin >> k;cout << pell(k) % 32767 << endl;}return 0;
}

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

#include<bits/stdc++.h>
using namespace std;
int palouti(int n) {if (n == 1) { return 1; }if (n == 2) { return 2; }return palouti(n - 1) + palouti(n - 2);}
int main() {int n;while (cin >> n) {cout << palouti(n) << endl;}return 0;
}

放苹果

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

【输入】

第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

【输出】

对输入的每组数据M和N,用一行输出相应的K。

/*
递归边界:盘子数目和苹果数目相同||盘子数目就一个
第一种情况:盘子数目比苹果数目多-->多出来的盘子数无用
第一种可转换为第二种
第二种情况:苹果数目大于等于盘子数目-->也分为两种情况:有盘子空余和无盘子空余
*/
#include<bits/stdc++.h>
using namespace std;
int apple, plate;
int f(int apple, int plate) {if (apple == 0|| plate == 1) { return 1; }if (plate > apple) { return f(apple, apple); }if (apple >= plate) {return f(apple, plate - 1) + f(apple - plate, plate);}
}
int main() {cin >> apple >> plate;cout<<f(apple, plate);return 0;
}

求最大公约数

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){return b == 0 ? a : gcd(b, a % b);
}
int main() {int a, b;cin >> a >> b;cout << gcd(a, b);return 0;
}

2的幂次方表示

任何一个正整数都可以用2的幂次方表示。例如:

137=27+23+20

同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:

2(7)+2(3)+2(0)

进一步:7=22+2+20(21用2表示)

3=2+20

所以最后137可表示为:

2(2(2)+2+2(0))+2(2+2(0))+2(0)

又如:

1315=210+28+25+2+1

所以1315最后可表示为:

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

#include<bits/stdc++.h>
using namespace std;
void f(int n) {int c = 0;while (pow(2, c)<=n) {c++;}c--;if (c == 0) {cout << "2(" << c << ")";}else if (c == 1) {cout << "2(" << c << ")";}else {cout << "2(";f(c);cout<< ")";}int other = n - pow(2, c);if (other) {cout << "+";f(other);}}
int main() {int num;cin >> num;f(num);}

分数求和

#include<bits/stdc++.h>
using namespace std;
int gcd(int n, int m) {return m == 0 ? n : gcd(m, n % m);
}
int main() {int a, b, c, d, e, f, n;scanf_s("%d%d/%d", &n, &a, &b);for (int i = 2; i <= n; i++) {scanf_s("%d/%d", &c, &d);e = (b * d) / gcd(b, d);a *= e / b;  b = e;a += c * (e / d);}int k = gcd(a, b);if (a % k == 0) {printf("%d/%d", a / k, b / k);}else {printf("%d/%d", a, b);}return 0;
}

因子分解

#include<bits/stdc++.h>
using namespace std;
void fact(int n, int a) {int b = 0;while (n == 0 || a > n) {return;}while (n % a == 0) {b++;n /= a;}if (b >= 1) {if (b == 1) {printf("%d", a);}else {printf("%d^%d", a, b);}if (n > a) {cout << "*";}}fact(n , a + 1);
}
int  main() {int n;cin >> n;fact(n,2);}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小白笔记:JetsonNano学习(二)JetsonNano 安装开机问题屏幕进不去】

重新烧录sd卡后插入Jetson Nano后出现的界面显示烧录失败&#xff0c;如下所示&#xff1a; 将经过烧录之后的sd卡插入jetson nano之后出现以下的几个界面&#xff0c;表示烧录失败。 原因分析&#xff1a;烧录的tf卡为sd卡时候的格式化的格式不对&#xff0c;新建格式出错&am…

Hack The Box-Analytics

目录 信息收集 namp whatweb WEB 信息收集 feroxbuster RCE漏洞 提权 get user get root 信息收集 namp 端口信息探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.233 --min-rate 10000 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-…

Python面向对象——架构设计【2】

练习1&#xff1a;打电话 请使用面向对象思想描述下列情景: 小明使用手机打电话,还有可能使用座机.... class People:def __init__(self,name):self.name namedef call_up(self,tool):print(self.name,end"")tool.call()class Tools:def __init__(self,way):self.wa…

OpenCV(八)——基本线条操作

基本线条操作 OpenCV中提供了基本的线条的操作&#xff0c;包括画直线、画矩形、画圆形等。 &#xff08;1&#xff09;画直线&#xff0c;在OpenCV中利用line()画直线&#xff0c;形式为image_with_line cv2.line(image, start_point, end_point, color, thickness)。line(…

智慧矿山新趋势:大数据解决方案一览

1. 背景 随着信息技术的快速发展和矿山管理需求的日益迫切&#xff0c;智慧矿山作为一种创新的矿山管理方式应运而生。智慧矿山借助先进的信息技术&#xff0c;实现对矿山生产、管理、安全等各方面的智能化、高效化、协同化&#xff0c;是矿山行业转型升级的必然趋势。 欢迎关…

【LabVIEW FPGA入门】并行执行

利用图形化编程的并行特性以及 FPGA 上 LabVIEW 图的真正并行实现&#xff0c;您可以通过将应用程序代码划分为更小的进程来进一步优化执行速度。与整个应用程序在一个循环中运行相比&#xff0c;这使得每个进程能够实现更高的循环速率和更高的应用程序整体执行速率。 …

Java语法学习八之认识String类

String类的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可以使用标准库提供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想&#xff0c;而…

C++开发基础——函数模板

一&#xff0c;函数模板 1.基础概念 模板编程是C中泛型编程的基础。 一个模板可以是创建类或者函数的蓝图。 模板编程分两种&#xff0c;分别是算法抽象的模板、数据抽象的模板。算法抽象的模板以函数模板为主&#xff0c;数据抽象的模板以类模板为主。 基于函数模板生成的…

13.Python从入门到精通—Python 集合操作与方法概览

13.Python从入门到精通—Python 集合操作与方法概览 Python 集合集合的基本操作1、添加元素2、移除元素3、计算集合元素个数4、清空集合5、判断元素是否在集合中存在 集合内置方法完整列表 Python 集合 在Python中&#xff0c;集合是一种无序、不重复的数据类型。集合通常用于…

MVC接收请求教程

mvc接收各种请求 1-环境搭建 1.1-准备apifox发送请求 1.2-项目搭建 ①创建Web骨架的Maven项目 ​ --打开2023-IDEA &#xff0c;选择New Project ​ --选择Maven Archetype ​ --注意点&#xff1a;Catalog默认就行了 ​ --Archetype选择webapp ​ --JDK跟着黑马敲最好…

无需借助任何三方软件,使用Windows自带分区功能实现磁盘分区!

像上面截图那样,如果当你由于文件分类或磁盘容量,想增加或减少分区盘符该怎么办。简单的理解就是怎么从E盘再分出个F盘,或者怎么从E盘分出点空间把D盘空间增大。 这里就牵扯出一个概念,磁盘分区,大概意思就是把一整个物理磁盘在系统上分出好几块区域,用来存放不同的文件…

【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、二叉搜索树介绍二、二叉搜索树的模拟实现2.1 结点2.2 成员变量2.3 默认成员函数2.3.1 constructor2.3.2…

Springboot笔记-01

简化spring应用开发&#xff0c;约定大于配置 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 优点&#xff1a; 快速创建独立运行的spring项目以及于主流框架集成 使用嵌入式的Servlet容器&#x…

IonQ最新研究突破!引入光量子纠缠以构建量子计算网络

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;700字丨5分钟阅读 2024年2月22日&#xff0c;美国量子计算公司IonQ宣布&#xff0c;公司研究团队已实现可重复地生成与离子纠缠的光子&#…

目标检测——YOLOv4算法解读

论文&#xff1a;YOLOv4&#xff1a;Optimal Speed and Accuracy of Object Detection 作者&#xff1a;Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao 链接&#xff1a;https://arxiv.org/pdf/2004.10934.pdf 代码&#xff1a;https://github.com/AlexeyAB/darkne…

如何使用Excel进行设备管理:巡检、维修、保养、备件管理

在现代企业运营中&#xff0c;设备管理是维持生产效率和保障生产安全的关键环节。良好的设备管理包括设备的巡检、维修、保养和备件管理等多个方面。随着信息技术的发展&#xff0c;许多企业开始利用电子化工具来提高设备管理的效率和准确性。其中&#xff0c;Excel作为一款功能…

旅游行业分析及媒体邀约资源汇总

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 酒店旅游行业分析及媒体邀约资源汇总是两个相对独立但又相互关联的领域。下面将分别对这两个方面进行概述。 酒店旅游行业分析 1. 市场概况 市场规模&#xff1a;评估市场的总价值、增长…

react中使用antdesign组件库的table组件实现自定义筛选菜单

需求如下&#xff1a; 这是一个表格的表头信息&#xff0c;实现这几列的筛选。 涉及到的筛选有&#xff1a;自定义选择项&#xff0c;动态生成选择项&#xff0c;自定义筛选菜单展示 1、依据antdesign官方给出的例子实现的&#xff0c;比如第一列&#xff0c;使用的是&#x…

阿里云RDS MySQL与自建MySQL数据库进行主从同步(GTID方式)

1、创建数据库&#xff0c;dump阿里云RDS数据&#xff0c;导入到自建MySQL 阿里云RDS的配置几乎不用动&#xff0c;只需从RDS开一个只读的账号出来。 在ECS服务器上远程导出RDS的数据库&#xff0c;执行下面命令&#xff0c;记得将[]内容替换掉 mysqldump -h http://***.mys…

安装vcenter管理esxi

安装vcenter管理esxi虚拟化操作系统 文章目录 安装vcenter管理esxi虚拟化操作系统1.安装vcenter2.vcenter的应用 1.安装vcenter esxi虚拟机具体安装步骤请参考上一篇文章&#xff0c;vcenter软件包需自己到网上下 2.vcenter的应用