算法笔记——递归(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.rhkb.cn/news/192600.html

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

相关文章

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要&#xff1a; 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统&#xff0c;它能够提高效率&#xff0c;减少错误&#xff0c;并提供详细的车辆历史记录&#xff0c;可以帮助车辆维修企业实现信息化管理&#xff0c;提高工作效率和客户满意度&#xff0c;降低运营…

系列八、Mybatis一对多查询,只查询出了一条记录

一、Mybatis一对多查询&#xff0c;只查询出了一条记录 1.1、问题说明 典型的权限管理框架的数据库表中&#xff0c;一般会存在这样3种角色的表&#xff0c;即用户表、角色表、用户角色关联表&#xff0c;表设计好之后&#xff0c;往这三张表中初始化了一些测试数据&#xff0…

在抖音电商,他们帮女性实现了L码自由

“很多&#xff08;女装&#xff09;店铺只做到L&#xff0c;甚至L&#xff08;其实&#xff09;是M码。”身高1米6、体重60公斤的达人鸭嗓明明120斤 在抖音上吐槽道&#xff0c;“尤其是夏天的连衣裙&#xff0c;胸围很多不超过85厘米&#xff0c;那它的意思就是你可以胖&…

Elasticsearch docker-compose 使用 Logstash 从 JSON 文件中预加载数据

在我们创建 Elasticsearch 进行开发时&#xff0c;最简单的办法就是在本地使用 docker-compose 来一键部署一个 Elasticsearch 集群。有时&#xff0c;特别是在准备测试环境时&#xff0c;开发人员希望从一开始就创建包含一些测试数据的数据库容器。我们可以使用 Logstash 来很…

3分钟带你了解前端缓存-HTTP缓存

前情提要 前端缓存分为下面三大类&#xff0c;本文主要讲解HTTP缓存~ 1. HTTP缓存 强缓存协商缓存 2. 浏览器缓存 本地小容量缓存本地大容量缓存 3. 应用程序缓存 HTML5应用程序缓存 缓存作用 减少了冗余的数据传输减少服务器的负担提高了网站的性能加快加载网页速度 …

IDEA 2023搭建 SpringMVC +FreeMarker+JDBC

1.IDEA的版本&#xff0c;目前最新是2023&#xff0c;要选择旗舰版。笔者曾选择社区版&#xff0c;发现少了很多功能。只能重新安装。 2.安装好以后的第1件事&#xff0c;是设置Maven&#xff0c;并将下载地址改为淘定站&#xff0c;参照这篇一次包会——最新IDEA配置Maven指南…

嵌入式LINUX——环境搭建 windows、虚拟机、开发板 互ping

摘要&#xff1a; 本文包含&#xff0c;如何设置linux开发板和虚拟机、windows 互ping成功 以及设置过程中出现的虚拟机、开发板查询不到eth0 windows ping开发板出项丢包等问题的解决方式。 windows端设置 windows端插入USB转网卡 打开windows桌面下右下角的网络标识 打…

51单片机+DS1302设计一个电子钟(LCD1602显示时间)

一、前言 电子钟是一种能够准确显示时间的设备&#xff0c;广泛应用于家庭、办公场所和公共场所&#xff0c;为人们提供了方便和准确的时间信息。本项目设计一个基于51单片机的电子钟&#xff0c;使用DS1302作为RTC时钟芯片&#xff0c;LCD1602作为显示屏&#xff0c;并通过串…

uniapp开发ios上线(在win环境下使用三方)

苹果 1、win环境下无法使用苹果os编译器所以使用第三方上传工具&#xff0c;以下示例为 初雪云 &#xff08;单次收费&#xff0c;一元一次&#xff09; 初雪云&#xff08;注册p12证书&#xff09;&#xff1a;https://www.chuxueyun.com/#/pages/AppleCertificate 苹果开发者…

Postman常见报错与解决方法,持续更新~

postman中文文档 基本操作&#xff1a;从控制台查看请求报错 如果 Postman 无法发送你的请求&#xff0c;或者如果它没有收到你发送请求的 API 的响应&#xff0c;你将收到一条错误消息。此消息将包含问题概述和指向控制台的链接&#xff0c;你可以在其中访问有关请求的详细信…

Visual Studio Code安装和设置中文

文章目录 Visual Studio Code安装Visual Studio Code设置中文 步骤如下: Visual Studio Code安装 1.下载安装包 VS Code的官网 下载链接中的“az764295.vo.msecnd.net” 替换为国内镜像地址“vscode.cdn.azure.cn”&#xff0c;下载速度直接飙升至几十 Mb/s。(在官网下载速度…

【OpenCV(3)】linux arm aarch 是 opencv 交叉编译与使用

文章目录 1、直接找github 别人编译好的2、自主编译参考 3使用CMake检查 参考 1、直接找github 别人编译好的 测试很多&#xff0c;找到一个可用的。 https://github.com/dog-qiuqiu/libopencv 它用了超级模块&#xff01; OpenCV的world模块也称为超级模块&#xff08;supe…

NovelD: A Simple yet Effective Exploration Criterion论文笔记

NovelD:一种简单而有效的探索准则 1、Motivation 针对稀疏奖励环境下的智能体探索问题&#xff0c;许多工作中采用各种内在奖励(Intrinsic Reward)设计来指导困难探索环境中的探索 &#xff0c;例如&#xff1a; ICM&#xff1a;基于前向动力学模型的好奇心驱动探索RND&…

【Qt-23】Qt charts绘制曲线图

一、QChart简介 QChart是Qt中专门用于绘制图表的模块&#xff0c;支持折线图、柱状图、饼图等常见类型。其主要组成部分有&#xff1a; QChart&#xff1a;整个图表的容器&#xff0c;管理图表中的所有数据和图形属性QChartView&#xff1a;继承自QGraphicsView&#xff0c;用于…

小波神经网络的时间序列预测——短时交通流量预测

大家好&#xff0c;我是带我去滑雪&#xff01; 小波神经网络&#xff08;Wavelet Neural Network&#xff0c;WNN&#xff09;结合了小波变换和神经网络的特性&#xff0c;是一种在信号处理和模式识别领域应用广泛的神经网络模型。它的设计灵感来自于小波变换的多尺度分析特性…

解决k8s通过traefik暴露域名失败并报错:Connection Refused的问题

我敢说本篇文章是网上为数不多的解决traefik暴露域名失败问题的正确文章。 我看了网上太多讲述traefik夸夸其谈的文章了&#xff0c;包含一大堆复制粘贴的水文和还有什么所谓“阿里技术专家”的文章&#xff0c;讲的全都是错的&#xff01;基本没有一个能说到点子上去&#xf…

Istio学习笔记-部署模型

参考&#xff1a;Istioldie 1.18 / 部署模型 当您将 Istio 用于生产环境部署时&#xff0c;需要确定一系列的问题。 网格将被限制在单个集群中还是分布在多个集群中&#xff1f; 是将所有服务都放置在单个完全连接的网络中&#xff0c;还是需要网关来跨多个网络连接服务&#…

优秀智慧园区案例 - 新华三未来工厂制造园,园区业务创新及零碳升级

目录 一、新华三未来工厂制造园建设背景 二、未来工厂制造园总体设计思路 三、未来工厂制造园建设内容 四、关键技术及创新点 五、应用效益与推广 关键词&#xff1a;智慧园区解决方案&#xff0c;智慧园区建设总体方案&#xff0c;智慧园区建设规划方案&#xff0c;智慧园…

uniapp的实战总结大全

&#x1f642;博主&#xff1a;冰海恋雨 &#x1f642;文章核心&#xff1a;uniapp部分总结 目录 ​编辑 目录 前言&#xff1a; 解决方案 1. 跨平台开发 2. Vue.js生态 3. 组件库 4. 自定义组件 5. Native能力 6. 插件生态 7. 性能优化 写法 1. 模板&#xf…

PyCharm鼠标控制字体缩放

File->Settings->Keymap 右边搜索栏输入increase(放大)&#xff0c;可以看到下面出现increase Font Size(放大字体尺寸)&#xff0c;双击。 双击后出现几个选项&#xff0c;选择Add Mouse Shortcut,会出现一个页面给录入动作。 按住Ctrl同时鼠标向上滚动&#xff0c;该动…