算法笔记——递归(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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-table本地与线上的样式不一致出现错乱

使用el-table的时候有几个表头是循环出来的&#xff0c;出现在本地运行的时候&#xff0c;表头内el-input输入框样式正常&#xff0c;但是发布以后出现样式错乱问题 线上样式错乱&#xff1a;​ 本地正常&#xff1a; 出现这个问题的原因是我有几个表头是循环出来的&#xff0…

阿里云2核2G云服务器99元一年!3M带宽的ECS云服务器哦

经济型e实例2核2G3M带宽优惠价99元一年 除了轻量服务器配置&#xff0c;经济型e实例2核2G3M配置也成为了用户关注的焦点。这款云服务器以99元一年的价格&#xff0c;适合个人和普通企业用户搭建网站、开发测试等需求。 我买的是阿里云这款99元的云服务器&#xff0c;活动参与地…

结婚请柬H5页面制作系统源码 带完整搭建教程

在过去的几年中&#xff0c;移动设备的普及率越来越高&#xff0c;人们越来越倾向于在手机上浏览网页。因此&#xff0c;开发一款基于H5技术的结婚请柬制作系统&#xff0c;可以满足用户在移动设备上浏览请柬的需求。今天源码小编来给大家介绍一款结婚请柬H5页面制作的源码系统…

开发技术-批量设置redis过期时间

1. 背景 项目组使用 Redis 太过奔放&#xff0c;许多 key 并没有设置过期时间&#xff0c;导致 Redis 服务器内存压力过大&#xff0c;需要成批次的为 key 设置过期时间。 2. 方法 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.st…

将按键放到输入框内:

如何将将Button放到输入框内&#xff1f; 效果图&#xff1a; 步骤如下&#xff1a; button 外围用template 包裹一层 <template #suffix v-if"row.WorkerRole TPM"> <el-inputtype"text"v-model"row.JobNumber"placeholder"…

2023年最新前端面试题汇总大全(含答案超详细,HTML,JS,CSS汇总篇)-- 持续更新

专项练习–持续更新 HTML篇CSS篇JS篇Vue篇TypeScript篇React篇微信小程序篇前端面试题汇总大全二&#xff08;含答案超详细&#xff0c;Vue&#xff0c;TypeScript&#xff0c;React&#xff0c;微信小程序&#xff0c;Webpack 汇总篇&#xff09;-- 持续更新 前端面试题汇总大…

平价护眼台灯推荐,好用且性价比高的护眼台灯推荐

想要选好护眼台灯首先我们要知道什么是护眼台灯&#xff0c;大的方向来看&#xff0c;护眼台灯就是可以保护视力的台灯&#xff0c;深入些讲就是具备让灯发出接近自然光特性的光线&#xff0c;同时光线不会伤害人眼而出现造成眼部不适甚至是视力降低的照明设备。 从细节上看就…

智慧渔业捕捞计数项目设计书

&#xff08;一&#xff09;项目背景 根据捕捞水域的不同&#xff0c;我国水产捕捞可划分为海洋捕捞、远洋捕捞以及淡水捕捞三大类型。其中&#xff0c;淡水渔业主要是指在淡水水域进行捕捞、养殖以获得淡水水产品并对这些水产品进行加工的社会生产领域。 近年来&#xff0c;随…

酒店数据抓取

好的&#xff0c;以下是使用Haskell编写的一个简单的网页爬虫程序&#xff0c;用于抓取Booking.com和云地接酒店数据的示例。这个程序使用HTTP代理&#xff0c;代理信息为proxy_host: jshk.com.cn。 import Network.HTTP import Network.HTTP代理 import Network.URImain :: I…

CSS实现图片滑动对比

实现效果图如下&#xff1a; css代码&#xff1a; 知识点&#xff1a;resize: horizontal; 文档地址 <style>.image-slider {position: relative;display: inline-block;width: 500px;height: 300px;}.image-slider>div {position: absolute;top: 0;bottom: 0;left: …

学开发语言 求职互联网行业的未来发展

我喜欢回答各种各样的问题&#xff0c;自然也喜欢记录下自己的一些观点和看法。希望给朋友们多一点参考&#xff0c;也欢迎交流探讨。 提问&#xff1a; 自考本科&#xff0c;学的开发语言&#xff0c;问互联网行业求职和发展&#xff01; 作为一个资深码农&#xff0c;对这样…

Animate 2024 for mac动画制作软件

Animate 2024是一款由Adobe公司开发的强大动画制作软件&#xff0c;它能帮助用户轻松制作出各种精美的动画作品。Animate 2024拥有强大而直观的设计工作流程&#xff0c;能够让用户自由地构建动画场景、绘制精美的图形&#xff0c;并轻松添加动态效果。无论是传统手绘风格还是骨…

JavaScript中this关键字实践

● 在全局中&#xff0c; this关键字表示全局窗口 console.log(this);● 在严格模式下&#xff0c;this不指向函数本身&#xff0c;在非严格模式下&#xff0c;this指向全局窗口 console.log(this);const calcAge function (birthYear) {console.log(2037 - birthYear);cons…

空间数据结构笔记:层次包围盒树(Bounding Volume Hierarchy Based On Tree)

1 总览 层次包围盒树&#xff08;BVH树&#xff09;是一棵多叉树&#xff0c;用来存储包围盒形状。它的根节点代表一个最大的包围盒&#xff0c;其多个子节点则代表多个子包围盒。为了统一化层次包围盒树的形状&#xff0c;它只能存储同一种包围盒形状 2 AABB包围盒树&#x…

科研学习|研究方法——逻辑回归系数的显著性检验(python实现)

1. 背景 回归方程与回归系数的显著性检验 2. statsmodels 库 statsmodels库可以用来做逻辑回归、线性回归。并且会在summary中给出显著性检验的结果。最终我们想要的就是如下图的报告。 3. 计算过程 如果我们使用的sklearn构建的逻辑回归就没有办法直接输出这个报告&#xff0c…

Nexus的Linux服务器部署(菜鸟版)

Nexus的Linux服务器部署 一、下载与安装 使用Nexus搭建Maven私服&#xff0c;在离线环境中使用Maven&#xff0c;并自动从私服中下载依赖包和组件。 下载地址&#xff1a;https://www.sonatype.com/ 镜像仓库 腾讯云软件包镜像: https://mirrors.cloud.tencent.com/阿里软…

git简明指南

目录 安装 创建新仓库 检出仓库 工作流 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹&#xff0c;打开&#xff0c;然后执行 git init 以创建新的 git 仓库。 检出仓库 执行如下命令以创建一个本地仓库的克隆版本&…

Ridgeline plot / 远山图 / 山脊图 怎么画?怎么优化?

工具 Origin 2022 当然&#xff0c;用Matlab、Python也是可以的。 颜色配置 色卡调整

(论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking

文献阅读笔记&#xff08;分层卷积特征&#xff09; 简介 题目 Hierarchical Convolutional Features for Visual Tracking 作者 Chao Ma, Jia-Bin Huang, Xiaokang Yang and Ming-Hsuan Yang 原文链接 arxiv.org/pdf/1707.03816.pdf 关键词 Hierarchical convolution…

Banana Pi BPI-M5 Boot Log 导出说明

准备&#xff1a; Preparation: 1、 一块bpi的开发板&#xff0c;一根ttl的串口线&#xff0c;以及一张烧录好镜像的sd/tf卡&#xff08;烧录到eMMC也行&#xff09;。 1. A BPI development board, a TTL serial port cable, and an SD/TF card with a burned image (it ca…