递归算法c++

news2024/11/16 1:58:46

主页:(*´∇`*) 咦,又好了~ 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.coloradmin.cn/o/1528167.html

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

相关文章

esp8266WIFI模块教程:ATK-ESP8266——TCP网络通讯和服务器连接

前言 ATK-MW8266D 模块是正点原子推出的一款高性能 UART-WIFI&#xff08;串口-无线&#xff09;模块&#xff0c;ATK-MW8266D 模块板载了正点原子公司自主研发的 ATK-ESP-01 模块&#xff0c;该模块通过 FCC、CE 认证&#xff0c;可直接用于出口欧美地区的产品。   ATK-MW82…

springboot酒店管理系统 论文【源码】

springboot酒店管理系统开发说明 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1…

【SQL】1934. 确认率(IFNULL(); IF())

题目描述 leetcode题目&#xff1a;1934. 确认率 Code select Signups.user_id,ifnull(confirmation_rate1, 0) as confirmation_rate from Signups left join(select user_id,round(sum(if(actionconfirmed, 1, 0))/count(*), 2) as confirmation_rate1from Confirmationsgr…

蓝桥杯-24点-搜索

题目 思路 --暴力递归全组合的方法。只有4个数&#xff0c;4种计算方式&#xff0c;共有4 * 3 * 2 * 1 * 4种不同的情况&#xff0c;可以写递归来实现。 --每次计算都是两个数之间的运算&#xff0c;因此4个数需要3次计算&#xff0c;第一次计算前有4个数&#xff0c;第二次有…

Python:filter过滤器

filter() 是 Python 中的一个内置函数&#xff0c;用于过滤序列&#xff0c;过滤掉不符合条件的元素&#xff0c;返回由符合条件元素组成的新列表。该函数接收两个参数&#xff0c;一个是函数&#xff0c;一个是序列&#xff0c;序列的每个元素作为参数传递给函数进行判定&…

耐腐蚀高纯特氟龙塑料量瓶进口聚四氟乙烯材质PFA容量瓶

PFA容量瓶&#xff0c;也叫特氟龙量瓶&#xff0c;是用于配制标准浓度溶液的精确实验室器皿&#xff0c;是有着细长颈、梨形肚的耐强腐蚀平底塑料瓶&#xff0c;颈上有标线&#xff0c;常用来直接配制标准溶液和准确稀释溶液以及制备样品溶液。因其有着不易碎、材质纯净、化学稳…

Android studio开发中Virtual Device模拟器的设置和屏幕错位等问题

Android SDK开发中Virtual Device模拟器的设置和使用 本文介绍android studio2023 3.1.13版本中模拟器的设置和在cordova开发中的运行方法 对于老版android studioAVD模拟器的使用&#xff0c;参见&#xff1a;Android SDK手机应用开发中第三方模拟器、真机运行方法以及AVD模拟…

camelot pdf提取表格实践(记录)

参考&#xff1a; 巧用Python的camelot库批量提取PDF发票信息 关于文本pdf的表格抽取 AttributeError: module ‘camelot‘ has no attribute ‘read_pdf‘及类似问题解决办法 camelot 参数 https://blog.csdn.net/INTSIG/article/details/123000010 报错解决&#xff1a; Mod…

简析|创业老隋分享的人力RPO项目如何?

在当今社会&#xff0c;创业热潮席卷而来&#xff0c;各类项目层出不穷。近日&#xff0c;创业老隋分享的人力RPO项目引起了广泛关注。那么&#xff0c;这个项目究竟如何呢?是否靠谱?经过深入了解和分析&#xff0c;我认为这个项目是靠谱的。 首先&#xff0c;从项目的背景和…

2.1(TCP)

TCP—传输控制协议 是一种面向连接的可靠传输协议。可靠、有序、无丢弃和不重复。 特点&#xff1a; TCP是面向连接&#xff08;虚连接&#xff09;的传输层协议每一条TCP连接有且只能有两个端点。可靠、有序、无丢弃和不重复。TCP协议提供全双工通讯。 发送缓存 存放发送方…

Linux--Docker容器引擎

1、Docker是什么 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的 “虚拟机”。诞生于2013年&#xff0c;最 初的发起者是dotCloud公司。后来改名为Docker Inc&#xff0c;专注于Docker相关技术和产品的开发。Docker 项目目前已经加人啊Linux基金会&#x…

迅雷网盘推广拉新怎么申请授权怎么赚钱?

迅雷网盘作为国内知名的云存储服务提供商&#xff0c;拥有庞大的用户群体和稳定的服务质量。为了进一步扩大市场份额&#xff0c;迅雷网盘推出了拉新项目&#xff0c;通过给予推广者一定的佣金&#xff0c;鼓励他们向更多的人推广迅雷网盘。 网盘功能强大&#xff1a;作为国内比…

【送外卖的你】送外卖对程序员的职业发展有影响吗

送外卖对程序员的职业发展可能会有一些影响&#xff0c;具体取决于个人情况和职业目标。以下是一些可能的影响&#xff1a; 1. 时间管理&#xff1a;送外卖可能需要花费较多的时间和精力&#xff0c;这可能会对程序员的工作时间和项目进度产生一定的影响。需要合理安排时间&…

Zookeeper(三)一致性算法Paxos

目录 1. Paxos算法是什么2. Paxos算法产生背景2.1. 拜占庭将军问题2.2. Paxos算法由来2.3 产生背景 3. 算法详解3.1 角色 & 提案提案 (Proposal)角色 3.2. 问题描述3.2.1. 一致性算法的前置条件3.2.2. 不同角色通过发送消息进行通信 3.3. 推导过程3.3.1. 只有一个Acceptor3…

【四 (6)数据可视化之 Grafana安装、页面介绍、图表配置】

目录 文章导航一、Grafana介绍[✨ 特性]二、安装和配置1、安装2、权限配置&#xff08;账户/团队/用户&#xff09;①用户管理②团队管理③账户管理④看板权限 3、首选项配置4、插件管理①数据源插件②图表插件③应用插件④插件安装方式一⑤安装方式二 三、数据源管理1、添加数…

程序计数器

程序计数器 JVM中的程序计数器(Program Counter Register)并非是广义上所指的物理寄存器&#xff0c;是对物理PC寄存器的一种抽象模拟 PC寄存器(程序计数器) PC寄存器用来存储指向下一条指令的地址&#xff0c;也即将要执行的指令代码。由执行引擎读取下一条指令。 它是一块很…

机器人在果园内行巡检仿真

文章目录 创建工作空间仿真果园场景搭建小车模型搭建将机器人放在仿真世界中创建工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws仿真果园场景搭建 cd ~/catkin_ws/src git clone https://gitcode.com/clearpathrobotics/cpr_gazebo.git小车模型搭建 DiffBot是一种具有两个…

视频技术2:把rtsp转为各种格式,包括webrtc

前题是启动ABLMediaServer&#xff0c;把ini里的hls_enable1 1、添加rtsp到视频服务器 http://127.0.0.1:7088/index/api/addStreamProxy?secret035c73f7-bb6b-4889-a715-d9eb2d1925cc&vhost_defaultVhost_&appMedia&streamCamera_00001&enable_hls1&ur…

HTML5+CSS3小实例:具有悬停效果的3D闪耀动画

实例:具有悬停效果的3D闪耀动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, init…

电学基础知识

目录 电流 前言 电流的产生 电流的单位安培&#xff08;A&#xff09; 电路和电池 开路和闭路 电灯泡原理 对电池容量的理解 毫安时 毫瓦时 直流电和交流电 AC交流电 DC直流电 直流电和交流电对比 电压 对电器的电压和电流的理解 电阻 电压电阻电子的关系 欧…