递归算法

(1)递归需要满足的三个条件

  • 一个问题的解可以分解为几个子问题的解

    何为子问题?子问题就是数据规模更小的问题。

  • 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样

  • 存在递归终止条件

    把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。

(2)如何编写递归代码?

写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。

(3)递归的弊端:

递归有利有弊,利是递归代码的表达力很强,写起来非常简洁;而弊就是空间复杂度高、有堆栈溢出的风险、存在重复计算、过多的函数调用会耗时较多等问题。

分治算法

(1)什么是分治算法

分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

(2)基本思想及策略

分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

(3)分治法适用的情况

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

  • 该问题的规模缩小到一定的程度就可以容易地解决
  • 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
  • 利用该问题分解出的子问题的解可以合并为该问题的解;
  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

(4)分治法的基本步骤

  • 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
  • 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
  • 合并:将各个子问题的解合并为原问题的解。

递归使用的就是分治的思想,它是分治思想的一种具体实现。

算法- 递归算法 分治算法相关推荐

  1. 2.Python算法之分治算法思想

    1.什么是分治算法? 2.为什么需要分治算法? 3.分治算法基础 4.分治算法的解题一般步骤 5. 用分治算法--求顺序表中的最大值 5. 用分治算法--判断某个元素是否在列表中 6. 用分治算法-- ...

  2. 分治法的关键特征_算法系列之常用算法之一----分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主要是三点: 1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问 ...

  3. 贪心算法、分治算法和动态规划的区别

    贪心算法.分治算法和动态规划的区别 (1)分治法(divide and conquer method) 将原问题划分成若干个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合其结果,就 ...

  4. 算法8.分治算法计算a^n

    设a为一给定实数,设计一个分治算法,用于计算an (n为自然数),并分析其计算时间复杂度,要求该算法的计算效率高于蛮力算法. 1. 算法设计思路 1.当n为偶数的时候,an可以分治为(a^2/n)*( ...

  5. 搞定面试算法系列 | 分治算法三步走

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 江子抑 转自 | 编程拯救世界 主要思想 分治算法,即分而治之:把一个复杂问题分成两个或更多的相同或相似子问题,直到最后子问题可以简 ...

  6. 五大常用算法之一——分治算法

    分治算法(Divide and Conquer) 分治算法,简单理解就是把一个大规模的问题分成相同或者相似的子问题,直到最后子问题能很容易的求解,原问题的解通过子问题的解合并得到. 根据这个描述,我们 ...

  7. 十种常用算法之分治算法(java版)

    十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...

  8. 【Java算法】分治算法

    1.什么是分治算法? 分治法(Divide-and-Conquer)是一种很重要的算法. 分治就是"分而治之"的意思,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子 ...

  9. 【Java -- 算法】分治算法、动态规划、回溯法、贪心算法

    前言 一句话理解四种算法思想 分治:分而治之,先解决子问题,再将子问题的解合并求出原问题. 贪心:一条路走到黑,选择当下局部最优的路线,没有后悔药. 回溯:一条路走到黑,手握后悔药,可以无数次重来.( ...

最新文章

  1. 趣谈 23 种设计模式(多图 + 代码)
  2. Android中五种常用的menu
  3. 【Maven学习】定制库到Maven本地资源库
  4. Linux安装python-3.8
  5. 解决 QT 发送 HTTP 请求时遇到 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 问题
  6. 单片机小白学步系列(九) 用万用焊板搭建实验电路
  7. 移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网
  8. JavaScript循环遍历对象的属性,只要对象内的Value
  9. python判断中文函数_如何判断(或如何编写)一个没有副作用的python函数?
  10. java二进制的相关知识_java二进制运算基础知识点详解
  11. siege linux 压力测试工具
  12. 湖南超级计算机研学,以超算之速,跨越弦歌千年 | 建宁实验中学中考励志研学...
  13. 重装系统后如何恢复oracle10g数据…
  14. skywalking-介绍
  15. 华为实验28-WAN接入配置
  16. TopK Question
  17. 【无标题】asdas
  18. uAvionix获得FAA合同,部署和演示多个无人机同时飞行的C波段频率分配管理(FAM)
  19. Verilog-组合电路设计
  20. eclips启动code=13的处理经验

热门文章

  1. 全球与中国植物培养箱市场现状及未来发展趋势(2022)
  2. HSE\HEI\PLL\LSE\LSI
  3. if-elif-e方法lse的基本使用
  4. actuator微服务信息完善
  5. java上机实验作业 编写汽车类car_请问如何用Java编写一个汽车类Car
  6. 汽车百科系列之(七): 你喜欢什么样的车身颜色
  7. 64位win7旗舰版安装Microsoft Office Visio时报错
  8. 将音频翻译成文字的软件叫什么?这几个软件值得你一试
  9. java中获取某个Date为一年中的第多少周
  10. 基于逻辑回归的新闻数据集分类