算法--递归与分治

这里是@嘉禾何鹤的第一篇学习笔记

文章目录

  • 这里是@嘉禾何鹤的第一篇学习笔记
  • 前言
  • 一、递归
    • What is 递归?
    • 递归分类
    • 能够用递归解决的问题
  • 二、分治
    • 能够用分治解决的问题
    • 分治法的求解过程
    • 分治法的一般的算法设计模式
  • 三、这是一张图文无关的 彩蛋?


前言

决心当一名程序员的第一个月过去啦,得弊于大一C基础打得着实不够扎实,第一门专业课就给自己来了当头一棒,不能像别的科目靠手写笔记来总结啦,试着尝试一种新的方式,同样的手过千遍,下面就开始啦!


一、递归

What is 递归?

依稀记得在程序设计基础中绝对学到过,但是脑子就是没有整个代码的框架。还是从最简单的数学角度先来理解吧。

等差、等比数列的推到应该是自己最先想到,且最容易理解到的递归的应用了。将目前的解带到同一过程的下一步骤中去,不断地重复迭代,以求得最终的解的过程啦。还是用概括解释的不太清楚,不过自己明白就好啦。

迁移到程序当中,就是在定义一个过程或者函数时出现调用本过程或者本函数的成分(搬用的老师PPT)

递归分类

若调用自身,称之为直接递归。
若过程或函数p调用过程或函数q,而q又调用p,称之为间接
递归。
任何间接递归都可以等价地转换为直接递归。调用在内部实现时,并不是每次调用真的去复制。一个复制件存放到内存中,而是采用代码共享的方式,也就是它们都是调用同一个函数的代码,而系统为每一次调用开辟一组存储单元,用来存放本次调用的返回地址以及被中断的函数的参量值。

能够用递归解决的问题

(1)需要解决的问题可以转化为一个或多个子问题来求
解,而这些子问题的求解方法与原问题完全相同,只是在
数量规模上不同;
(2)递归调用的次数必须是有限的;
(3)必须有结束递归的条件(递归基)来终止递归。

二、分治

能够用分治解决的问题

(1)该问题的规模缩小到一定的程度就可以容易地解决。
(2)该问题可以分解为若干个规模较小的相同问题。
(3)利用该问题分解出的子问题的解可以合并为该问题
的解。
(4)该问题所分解出的各个子问题是相互独立的,即子
问题之间不包含公共的子问题。

分治法的求解过程

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

分治法的一般的算法设计模式

divide-and-conquer(P) { 
 if |P|≤n0 return adhoc(P); // 返回递归基 
 将P分解为较小的子问题 P1,P2,…,Pk; 
 for(i=1;i<=k;i++) //循环处理k次 yi=divide-and-conquer(Pi); //递归解决Pi 
 return merge(y1,y2,,yk); //合并子问题 }

三、这是一张图文无关的 彩蛋?

算法--递归与分治_第1张图片

你可能感兴趣的:(算法)