算法笔记——递归(1)

这里写目录标题

  • 递归的思想
  • 序列求最大值
  • 翻转字符串
  • 斐波那契数列
  • 数塔
  • 回文字符串
  • 上楼
  • 汉诺塔
  • 棋盘覆盖问题
  • 数字螺旋矩阵
  • 盒分形

递归的思想

子问题须与原始问题为同样的事,且更为简单。
不能无限制地调用本身,须有个出口,化简为非递归状况处理

序列求最大值

在这里插入图片描述
求出输出n个数据中的最大值
方法一:直接一边输出然后进行比较大小
方法二:利用数组然后用递归的思想进行

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100;
int a[N];//全局变量嘛,随意函数不需要再一次的定义了
int fin(int n)
{if (n == 1){return a[1];}else  return max(fin(n - 1), a[n]);  
}
int main()  
{int n;  cin >> n;  for (int i = 0; i < n; i++)  {cin >> a[i];  }printf("%d", fin(n));  return 0;  
}

翻转字符串

在这里插入图片描述
//其中考察的知识点有tring sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = “567”
//需要知道的是在c++中string库中 字符相加是自动的链接的

//翻转字符串
//利用了一个函数s.substr()
#include<iostream>  
#include<algorithm>  
#include<string>  
using namespace std;  
const int N = 1001;  
string s;  
string reverse(int n)  
{if (n == 1)  {return s.substr(0, 1);  }else  return s.substr(n - 1, 1) + reverse(n - 1);  
}
int main()  
{cin >> s;  cout << reverse(s.length()) << endl;  return 0;  
}

斐波那契数列

在这里插入图片描述

雯波那契数列
给定一个正整数n,求结果第n项f[n]
当n=1时,f[n]=1 n=2时 f[n]=1
n>2时 f(n)=f(n-1)+f(n-2)

#include <cstdio>   int f(int n) {   if (n <= 2) {   return 1;   } else {   return f(n - 1) + f(n - 2);   }
}int main() {   int n;   scanf("%d", &n);   printf("%d\n", f(n));   return 0;   
}

数塔

在这里插入图片描述

在这里插入图片描述

//#include<iostream>
//#include<algorithm>
//using namespace std;
//const int N = 1001;
//int a[N][N], n;
//int getmax(int i, int j)//从左边和右边分别求出最大值的路径,递归的方式
//{
//	if (n == i)//这个是到n层是的条件,进行反向的输出数据
//	{
//		return a[n][j];
//	}
//	else
//	{
//		return max(getmax(i + 1, j), getmax(i + 1, j + 1));//求出的是左右边值的最大值
//	}
//
//}
//int main()
//{
//	cin >> n;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= i; j++)//纵坐标是根据衡坐标来的,但是本质上还是二维数组
//		{
//			cin >> a[i][j];
//		}
//	}
//	printf("%d", getmax(1, 1));//调用二维数组衡坐标和纵坐标
//	return 0;
//}

回文字符串

在这里插入图片描述


//运用的是true进行判断的,实际的效果真的很好
//注意的点:
//求字符串的长度的时候,用s.length()本身自带的函数
//利用布尔函数进行
#include<iostream>
using namespace std;
string s;
bool personer(int i, int j)
{if (i >= j){return true;}else  return (personer(i + 1, j - 1) && s[i] == s[j]);  
}
int main()  
{cin >> s;  //判断是不是回文,'YES'是true,’NO‘是false  cout << personer(0, s.length() - 1) ? "YES" : "NO" << endl;  return 0;  
}

上楼

在这里插入图片描述
在这里插入图片描述
上楼问题,一共有n级台阶,每次选择上一级或者两级
例如当 n=3时,共有三种方式上楼:
一级->一级->一级;
一级->二级;
二级->一级。
因为就只有两种方式,所以


#include <cstdio>
int f(int n) 
{if (n <= 1) {return 1;}else {return f(n - 1) + f(n - 2);}
}
int main()   
{int n;  scanf("%d", &n);  printf("%d\n", f(n));  return 0;  
}

汉诺塔

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//#include <cstdio>
//#include <cmath>
//void moveHanoi(int n, char from, char to, char mid) 
//{
//    if (n == 0) 
//    {
//        return;
//    }
//    else 
//    {
//        moveHanoi(n - 1, from, mid, to);
//        printf("%c->%c\n", from, to);
//        moveHanoi(n - 1, mid, to, from);
//    }
//}
//
//int main() 
//{
//    int n;
//    scanf("%d", &n);
//    printf("%d\n", (int)pow(2.0, 1.0 * n) - 1);
//    moveHanoi(n, 'A', 'C', 'B');
//    return 0;
//}//步骤,将n-1个圆盘移动到辅助柱上面,最后一个移动到目标柱,然后将辅助柱上的所有移动到目标柱子上面
//void hanoi(int num,char sou, char tar, char aux)//圆盘的个数,起始点,目标点,辅助点
//{
//    static int count = 1;
//    if (num == 1)
//    {
//        cout << "第" << count << "次:从<<sou<<"移动到" <<tar<<endl;//            count++   
//    }   
//    else   
//    {   
//        hanoi(num - 1, sou, aux, tar);   
//        cout << "第" << count << "次:从" << sou << "移动到" << tar << endl;//        count++;   
//        hanoi(num - 1, aux, tar, sou);   
//    }   
//}

棋盘覆盖问题

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
int tile = 1;        // 骨牌序号
int board[128][128]; // 二维数组模拟棋盘// (tr,tc)表示棋盘的左上角坐标(即确定棋盘位置), (dr,dc)表示特殊方块的位置, size=2^k确定棋盘大小
void chessBoard(int tr, int tc, int dr, int dc, int size)
{// 递归出口if (size == 1)return;int s = size / 2; //分割棋盘int t = tile++;   //t记录本层骨牌序号// 判断特殊方格在不在左上棋盘if (dr < tr + s && dc < tc + s){chessBoard(tr, tc, dr, dc, s); //特殊方格在左上棋盘的递归处理方法}else{board[tr + s - 1][tc + s - 1] = t;             // 用t号的L型骨牌覆盖右下角chessBoard(tr, tc, tr + s - 1, tc + s - 1, s); // 递归覆盖其余方格}// 判断特殊方格在不在右上棋盘if (dr < tr + s && dc >= tc + s){chessBoard(tr, tc + s, dr, dc, s);}else{board[tr + s - 1][tc + s] = t;chessBoard(tr, tc + s, tr + s - 1, tc + s, s);}// 判断特殊方格在不在左下棋盘if (dr >= tr + s && dc < tc + s){chessBoard(tr + s, tc, dr, dc, s);}else{board[tr + s][tc + s - 1] = t;chessBoard(tr + s, tc, tr + s, tc + s - 1, s);}// 判断特殊方格在不在右下棋盘if (dr >= tr + s && dc >= tc + s){chessBoard(tr + s, tc + s, dr, dc, s);}else{board[tr + s][tc + s] = t;chessBoard(tr + s, tc + s, tr + s, tc + s, s);}
}int main()
{int boardSize = 8;                 // 棋盘边长chessBoard(0, 0, 3, 3, boardSize); // (0, 0)为顶点,大小为boardSize的棋盘; 特殊方块位于(3, 3)// 打印棋盘int i, j;printf("\n\n\n");for (i = 0; i < boardSize; i++){for (j = 0; j < boardSize; j++)  {printf("%d\t", board[i][j]);  }printf("\n\n\n");  }return 0;  
}

数字螺旋矩阵

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <cstdio>const int MAXN = 25;
int a[MAXN][MAXN], idx = 1;void genMatrix(int n, int x, int y) {if (n == 0) {return;} else if (n == 1) {a[x][y] = idx++;} else {for (int j = y; j < y + n - 1; j++) {a[x][j] = idx++;}for (int i = x; i < x + n - 1; i++) {a[i][y + n - 1] = idx++;}for (int j = y + n - 1; j > y; j--) {a[x + n - 1][j] = idx++;}for (int i = x + n - 1; i > x; i--) {a[i][y] = idx++;}genMatrix(n - 2, x + 1, y + 1);}
}int main() {  int n;  scanf("%d", &n);  genMatrix(n, 0, 0);  for(int i = 0; i < n; i++) {  for(int j = 0; j < n; j++) {  printf("%d", a[i][j]);  printf(j < n - 1 ? " " : "\n");  }}return 0;  
}

盒分形

在这里插入图片描述
在这里插入图片描述

#include <cstdio>
#include <cmath>
#include <cstring>const int MAXN = 3 * 3 * 3 * 3 * 3 * 3;
char mp[MAXN][MAXN];void f(int n, int x, int y) {if (n == 1) {mp[x][y] = 'X';} else {int unit = (int)pow(3.0, n - 2);f(n - 1, x, y);f(n - 1, x, y + 2 * unit);f(n - 1, x + unit, y + unit);f(n - 1, x + 2 * unit, y);f(n - 1, x + 2 * unit, y + 2 * unit);}
}int main() {int n;scanf("%d", &n);memset(mp, ' ', sizeof(mp));f(n, 0, 0);int edge = (int)pow(3.0, n - 1);for (int i = 0; i < edge; i++) {for (int j = 0; j < edge; j++) {printf("%c", mp[i][j]);}printf("\n");}return 0;
}

在这里插入图片描述

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

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

相关文章

【中间件篇-Redis缓存数据库05】Redis集群高可用高并发

Redis集群 Redis Cluster是Redis的分布式解决方案&#xff0c;在3.0版本正式推出&#xff0c;有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时&#xff0c;可以采用Cluster架构方案达到负载均衡的目的。之前,Redis分布式方案一般有两种: 1、客户端分…

【unity插件】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件

文章目录 前言地址描述Demo 演示Installation 安装如何玩演示用法使用示例完结 前言 一般的shader无法直接使用在UI上&#xff0c;需要在shader中定义特定的面板参数&#xff0c;今天就来推荐github上大佬做的一套开源的一系列UGUI&#xff0c;Shader实现的特效——UIEffect 为…

KODExplorer中ace.js代码编辑器中自定义PHP提示片段

目录 KODExplorerace.js参考 KODExplorer 这是搭建云盘工具&#xff0c;该工具可以作为在线开发工具使用&#xff0c;其中使用了ace.js作为编辑器&#xff0c;这里主要讲解ace.js编辑器中如何自定义代码提示下载旧版本&#xff0c;再升级到新版本&#xff0c;直接下载新版本没…

【Axure高保真原型】3D饼图_移入显示数据标签

今天和大家分享3D饼图_移入显示数据标签的原型模板&#xff0c;鼠标移入扇形区域时&#xff0c;对应区域会变绿&#xff0c;可以查看该区域对应的项目、数据和占比&#xff0c;这个原型模板是用Axure原生元件制作的&#xff0c;所以无需联网&#xff0c;而且可以自由修改样式、…

4种互斥机制比较

4种互斥机制 关中断禁止任务切换信号量互斥信号量 关中断 关中断&#xff08;Disable Interrupts&#xff09;&#xff1a;通过禁用中断来实现互斥。在关中断期间&#xff0c;任何中断请求都会被忽略&#xff0c;从而确保了临界区的独占性。然而&#xff0c;这种方法会导致系统…

基于Python实现汽车销售数据可视化【500010086】

导入模块 import numpy as np import pandas as pd import plotly.graph_objects as go import plotly.express as px获取数据 df1 pd.read_excel(r"./data/中国汽车总体销量.xlsx") print(df1.head(5))df1.info()df1[年份] df1[时间].dt.year df1[月份] df1[时…

Fourier分析导论——第5章——实数据R上的Fourier变换(E.M. Stein R. Shakarchi)

第5章 实数域ℝ上的Fourier变换 The theory of Fourier series and integrals has always had major difficulties and necessitated a large math- ematical apparatus in dealing with questions of con- vergence. It engendered the development of methods of summa…

CTFhub-RCE-读取源代码

源代码&#xff1a; <?php error_reporting(E_ALL); if (isset($_GET[file])) { if ( substr($_GET["file"], 0, 6) "php://" ) { include($_GET["file"]); } else { echo "Hacker!!!"; } } else {…

android studio开发flutter应用,使用mumu模拟器调试软件

安装好mumu模拟器&#xff0c;先打开网易mumu模拟器的开发者模拟。系统应用 > 设置 > 关于手机 > 版本号 多点击几次调出开发者模式&#xff1a; 然后找到mumu模拟器的安装目录&#xff0c;找到shell文件夹里面的adb.exe&#xff0c;然后执行命令&#xff1a; adb co…

Python requests 库中 iter_lines 方法的流式传输优化

在使用Python的requests库与服务器进行HTTP交互时&#xff0c;发现使用iter_lines方法并不能实现真正的流式传输&#xff0c;而是等待服务器返回一定量的数据或请求结束。这一问题在服务器返回的数据量较大时尤为明显&#xff0c;因为默认情况下&#xff0c;requests库会将数据…

做一个Springboot文章分类模块

目录 文章分类 1、新增文章分类 前言 代码编写 测试 2、 文章分类列表 前言 代码编写 测试 3、获取文章列表详情 前言 代码实现 测试 4、更新文章分类 前言 代码实现 测试 5、删除文章分类 前言 代码实现 测试 分页查询 文章列表条件分页 前言 代码编…

第 19 章 网络编程

网络可以使不同物理位置上的计算机达到资源共享和通信的目的&#xff0c;在Java中也提供了专门的网络开发程序包--java.net&#xff0c;以方便开发者进行网络程序的开发&#xff0c;本章将讲解TCP与UDP程序开发 19.1 网络编程简介 将地理位置不同的、具有独立功能的多台计算机…

三菱PLC小项目系列—传送带多地控制

目录 一、项目描述 二、IO口分配 三、项目程序 四、总结 一、项目描述 化工厂中有传送带进行原料传送加工&#xff0c;当按下启动按钮SB1或者SB2&#xff0c;电机M1接通控制传送带运转&#xff0c;直至按下停止按钮SB3&#xff0c;电机停止并使传送带停止运行。 二、IO口分…

远程创建分支本地VScode看不到分支

在代码存放处右击&#xff0c;点击Git Bash Here 输入git fetch–从远程仓库中获取最新的分支代码和提交历史 就OK啦&#xff0c;现在分支可以正常查看了

多行业用户齐聚,2023 IoTDB 用户大会详细议程更新!

上周我们官宣了 2023 IoTDB 用户大会举办的消息&#xff0c;获得了多方小伙伴们积极的响应&#xff0c;作为第一次线下大会&#xff0c;我们已经开始期待与大家线下相见&#xff01; 为了回应大家对于大会内容的期待&#xff0c;我们火速把更加详细的议程“搬运”来啦~ 20 位大…

【Java】集合(一)单列集合List

1.集合 可以动态保存任意多个对象&#xff0c;并提供了一系列的操作对象的方法&#xff1a;add、remove、set、get等。 2.集合框架体系 分为两大类&#xff1a; 单列集合和双列集合 3.List接口基本介绍 List接口是Collection接口的子接口 List集合类中元素有序&#xff0…

前后端设置跨域问题

前端 const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServer: { //记住&#xff0c;别写错了devServer//设置本地默认端口 选填port: 8080,proxy: { //设置代理&#xff0c;必…

【git】git本地仓库命令操作详解

这篇文章主要是针对git的命令行操作进行讲解&#xff0c;工具操作的基础也是命令行&#xff0c;如果基本命令操作都不理解&#xff0c;就算是会工具操作&#xff0c;真正遇到问题还是一脸懵逼 1.操作逻辑图 本地仓库的命令操作关系图 2.基本命令操作 1.1建立一个gittest01文…

二维码智慧门牌管理系统升级解决方案:标准地址ID查询服务:高效、精准

文章目录 前言一、解决查询效率低下的问题二、提高信息精准度三、应用案例 前言 随着城市的发展和信息化步伐的加快&#xff0c;二维码智慧门牌管理系统已成为各大城市管理部门和企事业单位的必备工具。然而&#xff0c;实际应用中存在一些问题&#xff0c;如查询效率低下、信…

navicat导入已有sql表过程

已知我有一个外部的sql表&#xff0c;如图&#xff1a; 想要将其导入navicat并运行。 看一下我的navicat&#xff0c; navicat里已有的数据库并没有library&#xff0c;所以需要建立一个同名的library数据库来存储library.sql文件。 具体步骤如下&#xff1a; 在“本地连接”…