算法笔记——递归(1)

news2024/12/23 3:45:03

这里写目录标题

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

递归的思想

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

序列求最大值

在这里插入图片描述
求出输出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.coloradmin.cn/o/1205273.html

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

相关文章

SQL学习之增删改查

文章目录 数据库数据类型建表create table插入数据insert into查询数据select from修改数据update set删除数据delete from备份ctas结果插入iis截断表 truncate table修改表结构alter table添加注释 注&#xff1a;本文的SQL语法是基于Oracle数据库操作的&#xff0c;但是基本的…

官宣合作|Space and Time的SQL证明使zkLogin更强大

为了实现Web3的承诺&#xff0c;必须有一种方法能够提供当前Web基础设施的所有功能&#xff0c;同时不会破坏区块链基础设施的零信任模型。能够在无需依赖第三方中介的情况下运行是一种基本哲学&#xff0c;也是区块链技术的优点&#xff0c;即提高安全性和效率的同时降低成本。…

跨境电商源码:多语言支持与扩展的终极解决方案

随着全球电商市场的不断扩大&#xff0c;跨境电商源码的需求日益增长。对于想要拓展国际业务的电商企业来说&#xff0c;多语言支持显得尤为重要。在这方面&#xff0c;我们的跨境电商源码产品具备显著优势&#xff0c;不仅全面支持多语言&#xff0c;还方便扩展多个语言的CSDN…

瑞萨e2studio(29)----SPI速率解析

瑞萨e2studio.29--SPI速率解析 概述视频教学时钟配置解析RA4M2的BRR值时钟速率7.5M下寄存器值3K下寄存器值 概述 在嵌入式系统的设计中&#xff0c;串行外设接口&#xff08;SPI&#xff09;的通信速率是一个关键参数&#xff0c;它直接影响到系统的性能和稳定性。瑞萨电子的…

windows安装composer并更换国内镜像

第一步、官网下载 下载地址 Composer安装https://getcomposer.org/Composer-Setup.exe第二步、双击安装即可 第三步选择 php安装路径并配置path 第四步、 composer -v查看安装是否成功&#xff0c;出现成功界面 第五步、查看镜像地址并更换&#xff08;composer国内可能较慢…

外汇天眼:3家平台牌照失效,远离以下平台!

监管信息早知道&#xff01;外汇天眼将每周定期公布监管牌照状态发生变化的交易商&#xff0c;以供投资者参考&#xff0c;规避投资风险。如果平台天眼评分过高&#xff0c;建议投资者谨慎选择&#xff0c;因为在外汇天眼评分高不代表平台没问题&#xff01; 以下是监管牌照发生…

DefaultListableBeanFactory

DefaultListableBeanFactory 是一个完整的、功能成熟的 IoC 容器&#xff0c;如果你的需求很简单&#xff0c;甚至可以直接使用 DefaultListableBeanFactory&#xff0c;如果你的需求比较复杂&#xff0c;那么通过扩展 DefaultListableBeanFactory 的功能也可以达到&#xff0c…

【教3妹学编程-算法题】逃离火灾

3妹&#xff1a;2哥&#xff0c;今日都立冬了&#xff0c; 可是天气一点都不冷。 2哥 : 立冬了&#xff0c;晚上要不要一起出去吃饺子&#xff1f;&#x1f95f; 3妹&#xff1a;好呀好呀&#xff0c;2哥请吃饺子喽 2哥 : 歪歪&#xff0c;我说的是一起出去吃&#xff0c;没说我…

python用pychart库,实现将经纬度信息在地图上显示

python使用pyecharts对给到的经纬度数据进行位置标注&#xff0c;下面是批量更新。给入数据&#xff0c;将地图生成。实验数据在下面附件。 from pyecharts import options as opts from pyecharts.charts import Geo import osfolder_path F:\\GPS file_names os.listdir(f…

mycat2 读写分离

mycat2 读写分离 mycat2 读写分离1.创建两个主从复制的数据库2.mycat2 读写分离3.mycat2读写分离测试 mycat2 读写分离 1.创建两个主从复制的数据库 参考&#xff1a;mysql主从复制 2.mycat2 读写分离 连接到mycat数据库 1.在mycat中创建数据库mydb1 CREATE DATABASE mydb…

数字化催生低代码开发浪潮,管理系统也能一键生成

近年来&#xff0c;数字经济以无比迅猛的势头崛起&#xff0c;成为引领全球经济变革的重要引擎。在这个数字化趋势日益明显的时代&#xff0c;企业的数字转型已经成为提高竞争力、适应市场需求的迫切需要。 随着科技的飞速发展&#xff0c;数字技术已经渗透到各个领域&#xff…

安防监控EasyCVR视频汇聚平台运维现场无法使用Linux抓包该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。监控视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、…

安装 Lua 的 HTTP 库

首先&#xff0c;你需要安装 Lua 的 HTTP 库。可以使用 LuaRocks 来安装。以下是安装命令&#xff1a; luarocks install http然后&#xff0c;你可以使用以下代码来爬取网页内容&#xff1a; local http require http-- 设置代理信息 http.set_proxy(jshk.com.cn)-- 网页UR…

社区新零售:改变生活方式的创新商业模式

社区新零售&#xff1a;改变生活方式的创新商业模式 社区新零售&#xff0c;顾名思义&#xff0c;以社区为核心&#xff0c;利用互联网、大数据、人工智能等先进技术&#xff0c;将线上购物和线下体验有机结合&#xff0c;形成一种全新的零售模式。它特别强调地理位置的便利性&…

mysql的主从复制,读写分离

主从复制&#xff1a;主mysql的数据&#xff0c;新增&#xff0c;修改&#xff0c;表里的数据都会同步到从mysql上 主从复制的模式&#xff1a; 1 异步复制 mysql 的最常用的复制&#xff0c;只要执行完&#xff0c;客户端提交事务&#xff0c;主mysql 会立即把结果返回给从…

大厂设计师必备的8款Sketch插件

每个设计师都渴望有一个高效的插件来提高他们的设计能力。设计插件有助于自动化工作流程&#xff0c;快速组织设计文件或简化内容创建。Sketch可以说是设计师知名的设计工具&#xff0c;特别是其资源社区拥有丰富的Sketch插件&#xff0c;大大提高了设计师的工作效率。本文让设…

虹科教您 | 如何选择超声波储罐液位传感器(二)

来源&#xff1a;虹科传感器 虹科教您 | 如何选择超声波储罐液位传感器&#xff08;二&#xff09; 教程背景 超声波储罐液位传感器具有非接触式测量的优点&#xff0c;可以适用于各种不同的液体和环境。本教程将紧跟上期&#xff0c;通过Q&A的形式&#xff0c;帮助您根…

同城服务如何引流和推广 同城小程序制作

客观原因线下实体店经营变得很艰难&#xff0c;而抖音推出的同城号功能&#xff0c;为许多商家带来了新的生机。抖音同城号的操作很简单&#xff0c;只需在短视频发布时打开同城号&#xff0c;短视频将被投入到同城流量池中&#xff0c;可以让位置附近的用户看到&#xff0c;线…

阿里云容器镜像服务的运维总结

一、背景 容器镜像服务&#xff0c;作为一个可选付费产品&#xff0c;主要作用是存储docker的镜像仓库&#xff0c;供k8s拉取到Pod节点里。 你可以自己搭建一个harbor镜像仓库&#xff0c;在公司的开发环境下&#xff0c;将image推送到仓库&#xff1b;然后在生产k8s从仓库拉取…

Matplotlib的使用方法

Matplotlib是Python最著名的绘图库&#xff0c;它提供了一整套和Matlab相似的命令API&#xff0c;十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件&#xff0c;嵌入到GUI应用程序中。Matplotlib能够创建多数类型的图表&#xff0c;如条形图、散点图、条形图、饼图…