分治策略与递归

news2025/8/3 8:51:21

目录

  • 分治策略
    • 分治概念
    • 递归概念
    • 分治策略的特征
    • 分治法步骤
  • 举例
    • 阶乘
    • 斐波那契数列
    • 打印数组
    • 数组中查找元素

分治策略

分治概念

任何可以用计算机求解的问题所需要的时间都与其规模有关。问题规模越小,所解题所需要的时间就越小,从而也较容易处理。例如:对于n个元素的排序问题,当n=1时,不需要任何计算,当n=2时,只要做一次比较即可排序好,n=3时,只要进行两次比较即可,当n越来越大,这个问题的就不那么容易处理了。要想直接解决一个较大的问题,比较困难。就需要用到分治思想。
分治法的设计思想是将一个难以直接解决的问题,分割成一些规模较小的相同问题,便于各个击破,分而治之,如果原问题可以分割成k个子问题,1<k<=n,且这些问题都可解,并且可利用这些子问题求出原问题的解,那么这种分治法是可行的。由分治法产生的子问题往往是原问题的较小规模模式,这就为使用递归技术提供了遍历,反复使用分治手段可以使子问题与原问题类型一致而规模不断缩小,最终使子问题缩小到很容易求解。

递归概念

递归:若一个函数直接或间接的调用自己,则称这个函数是递归函数。(自己调用自己)

分治策略的特征

分治法能解决的问题一般具有以下四个特征:

  • 该问题的规模缩小到一定程度上可以很容易的解决。
  • 该问题可以分解为若干个规模较小的相同问题。
  • 使用小规模的解可以合并成为原问题规模的解。
  • 该问题所解组合原规模问题的解。

分治法步骤

在分治策略中递归地求解一个问题,在每层递归中应用步骤如下:

  • 分解:将问题划分成一些子问题,子问题的形式和原问题一样,知识规模更小。
  • 解决:递归的求解子问题。如果子问题的规模足够小,则停止递归,直接求解。
  • 合并:将小规模的解合成原问题规模的解。

举例

阶乘

循环的方法:

int fun(int n){
int sum=1;
  for(int i=1;i<=n;++i){
  sum*=i;
  }
  return sum;
}

递归:
加入n=4,便是如下图,n=4时将n-1的用作参数调用自身函数一直调用下去直到遇到最小的子问题n=1,n=1即可。
在这里插入图片描述

int fac(int n){
if(n==1) return n;
else return fac(n-1)*n;
}

有了阶乘这个举例,我们从内存来看递归,每调用一次函数,系统就会开辟一个栈桢,不可能无限开辟,因为栈的大小是有限的,所以也不可能无限递归。一直递归下去,直到找到最小问题的解,才会开始释放空间,原理和栈一样,先开辟的后释放,

斐波那契数列

循环:

int fib(int n){
 int a=1,b=1,c=1;
 for(int i=3;i<n;++i){
 c=a+b;
 a=b;
 b=c;
 }
 return c;
 }

递归程序:

int fib(int n){
if(n==1||n==2) return 1;
else return fib(n-1)+fib(n-2);
}

其很明显第n位等于第n-1位与第n-2位的和,其递推关系图就是二叉树的样子,用这样递归的话其时间复杂度位O(2^n),空间复杂度时S(n),而循环时间复杂度为O(n),有没有其他办法使得其时间复杂度为O(n)呢,我们看如下代码:

int fibc(int n,int a,int b) {
	if (n == 1 || n == 2) return a;
	else {
		return fibc(n - 1, b,a+b);
	}
	
}
int fun(int n) {
	int a = 1, b = 1;
	return fibc(n, a, b);
}

这时怎么样一个思想呢,其实就是将循环的代码转换成了递归,循环中我们将c作为中间变量进行输出,此处呢我们没有用到循环变量,直接将b和a+b作为参数调用自身函数。

打印数组

代码:

void Print(const int *arr,int n){
    Print(*arr,n-1);
    Print("%5d",arr[n-1]);
}
void Printar(const int *arr,int n) {
	if (arr == nullptr||n<1) return;
	Print(arr,n);
	printf("\n");
}

我们通过仔细观察就会发现Print()函数中,如果先输出就会输出倒着打印,如果先调用函数就会顺序打印。

数组中查找元素

int Find(const int *arr,int n,const int val) {
	if (n == 0 || arr[n-1]==val) return n-1;
	else return Find(arr, n-1,val);
	
}
int Findvalue(const int *arr,int n,const int val) {
	if (arr == nullptr || n < 1) return -1;
	else return Find(arr, n, val);
}
/*
int Findvalue(const int *arr,int n,const int val) {
	if (arr == nullptr||n<1) return -1;
	else {
		if(val==arr[n-1]) return n-1;
		Findvalue(arr, n - 1, val);
	}
}
*/

通过做题便可以让自己的逻辑更加鲜明,下去可以多做一写题来找到递归的技巧。

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

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

相关文章

11.9 至 11.17 四道典型题记录: Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装

11.9 至 11.17 四道典型题记录&#xff1a; Counter 弹出 | map函数 | 子集求取 | 有序字符桶分装 昨天休息的时候一直在想应该学习哪种语言&#xff0c;我想这也是好多人发愁无法下手的原因之一&#xff0c;今年找工作的时候发现更多的研究岗位需要的是 C 语言 或 C 语言&…

RocketMQ的事务消息和改造

什么是 rmq分布式事务消息&#xff1f; Apache RocketMQ在4.3.0版中已经支持分布式事务消息&#xff0c;这里RocketMQ采用了2PC的思想来实现了提交事务消息&#xff0c;同时增加一个补偿逻辑来处理二阶段超时或者失败的消息&#xff0c;如下图所示。 事务消息解决什么问题&…

Java学习笔记 --- 多线程

一、线程相关概念 程序 程序是为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。简单的说就是我们写的代码 进程 1、进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存空间。当我们使用迅雷&…

程序控制结构

程序控制结构程序流程控制介绍顺序控制分支控制if-else单分支案例&#xff1a;编写一个程序&#xff0c;可以输入人的年龄&#xff0c;如果该同志的年龄大于等于 18 岁, 则输出 "你年龄大于 18,要对自己的行为负责,送入监狱"。双分支案例&#xff1a;编写一个程序&am…

关于Python函数的几点说明

关于Python函数的几点说明 本文介绍Python函数返回值、调用函数加括号和不加括号有什么区别、冒号后面省略号&#xff08;...&#xff09;和 pass等说明。 一、为什么函数意外返回“None” 初学者可能遇到这种情况&#xff0c;定义的函数意外返回“None”&#xff0c;例如&a…

Qt error: fatal error: Killed signal terminated program cc1plus

Qt error: fatal error: Killed signal terminated program cc1plus 文章目录Qt error: fatal error: Killed signal terminated program cc1plus摘要1 出现问题原因2 解决方法虚拟机物理机增加SWAP交换空间关键字&#xff1a; qt、 fatal、 error、 cc1plus、 Killed signal …

K8S实战 - 如何在kubernetes中安装软件

如何在kubernetes中安装软件 1、编写脚本安装 通过编写yaml文件&#xff0c;执行kubectl apply -f 可以安装软件 编写yaml的时候注意事项&#xff1a; pod的类型&#xff08;deployment、statefulset等&#xff09;端口的定义&#xff08;service&#xff09;配置文件的定义…

艾美捷Cholesterol胆固醇功效和参数说明

胆固醇又称胆甾醇。一种环戊烷多氢菲的衍生物。其溶解性与脂肪类似&#xff0c;不溶于水&#xff0c;易溶于乙-醚、氯-仿等溶剂。胆固醇是动物组织细胞所不可缺少的重要物质&#xff0c;它不仅参与形成细胞膜&#xff0c;而且是合成胆汁酸&#xff0c;维生素D以及甾体激素的原料…

[附源码]计算机毕业设计JAVA公益劳动招募管理系统

[附源码]计算机毕业设计JAVA公益劳动招募管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

漏洞深度分析|Apache MINA SSHD反序列化漏洞

项目介绍 Apache MINA SSHD 是一个 100% 纯 java 库&#xff0c;支持客户端和服务器端的 SSH 协议。它的目的不是要替代 Unix 操作系统中的 SSH 客户端或 SSH 服务器&#xff0c;而是为需要 SSH 支持的基于 Java 的应用程序提供支持。 该库可以利用多个 I/O 后端&#xff1a; …

最小二乘法在ISP CCM标定中的简介

一、基础知识 假设我们有16幅名人脸部灰度图像&#xff0c;我们是否可以找到16幅脸部图像的线性组合&#xff0c;使得其线性组合最接近于目标脸部图像呢&#xff1f; 名人库我们知道灰度图像可以用矩阵表示。假设有如下灰度图。 我们可以用矩阵表示为&#xff1a; 我们也可以用…

Python机器学习16——相关向量机(RVM)

本系列基本不讲数学原理&#xff0c;只从代码角度去让读者们利用最简洁的Python代码实现机器学习方法。 背景介绍 学机器学习的应该都知道支持向量机&#xff08;SVM&#xff09;&#xff0c;这个方法在深度学习兴起之前算是很热门的分类方法&#xff0c;在机器学习里面&#…

Go: 通过Fiber构建微服务

文章目录简介1. 微服务2. Fiber&#xff1f;Fiber集成及使用1.安装fiber2. 简单使用3.简单实例小结简介 1. 微服务 微服务或微服务架构是一种体系结构风格&#xff0c;可以将应用程序构建成一个服务的集合&#xff1a; Maintainable 可维修Testable 可测试的Loosely coupled…

毫米波雷达基础知识系列——FFT

毫米波雷达基础知识系列——FFT及DSP优化实现FFT来源FFT为什么快FFT的种类基2FFT推导FFT来源 FFT来源于DFT离散傅里叶变换&#xff0c;DFT的计算公式为&#xff1a; X(k)∑n0N−1x(n)WNknX(k) \sum_{n0}^{N-1} x(n)W_{N}^{kn} X(k)n0∑N−1​x(n)WNkn​ 为什么不直接用DFT计算…

【 java 常用类】日期相关 API 操作

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

ZYNQ之FPGA学习----MMCM/PLL IP核使用实验

1 MMCM/PLL IP核介绍 PLL 的英文全称是 Phase Locked Loop&#xff0c;即锁相环&#xff0c;是一种反馈控制电路。PLL 对时钟网络进行系统级的时钟管理和偏移控制&#xff0c;具有时钟倍频、分频、相位偏移和可编程占空比的功能 Xilinx 7 系列器件中的时钟资源包含了时钟管理…

Kata3.0.0 x LifseaOS x 龙蜥内核三管齐下!带你体验最新的安全容器之旅

文/云原生SIG 北京时间 2022 年 10 月 10 日&#xff0c;袋鼠 RunD 安全容器&#xff08;Rust Kata runtime Dragonball VMM&#xff09;正式作为安全容器上游 Kata Container 3.0.0 release 版本的重要特性发布。 龙蜥体验包 安全容器作为龙蜥云原生重要项目&#xff0c;我…

EEG微状态预测并发fMRI动态功能连接状态

前言 静息态功能磁共振成像(rs-fMRI)测量的大脑功能连接在多个时间尺度上有所不同&#xff0c;并确定了循环的动态功能连接(dFC)状态。这些发现与不同的认知和病理状态有关&#xff0c;有可能作为疾病的生物标志物&#xff0c;但它们的神经基础仍然存在争议。在静息态EEG研究中…

docker常见问题汇总(持续更新中)

Docker pull 时报错如下&#xff1a; -bash-4.2# docker pull hub.yj.com/test/dep_client:test Error response from daemon: Get http://hub.yj.com/v2/: dial tcp: lookup hub.yj.com on 218.2.135.1:53: server misbehaving如下图&#xff1a; 原因解析&#xff1a; 本地…

【算法系列】非线性最小二乘-高斯牛顿法

系列文章目录 【算法系列】卡尔曼滤波算法 【算法系列】非线性最小二乘求解-直接求解法 【算法系列】非线性最小二乘求解-梯度下降法 【算法系列】非线性最小二乘-高斯牛顿法 文章目录 系列文章 文章目录 前言 一、牛顿法 二、高斯-牛顿法 1.由牛顿法推导 2.直接展…