算法-chapter2递归与分治-概述
算法-chapter2递归与分治-概述
这里是@嘉禾何鹤的第一篇学习笔记
文章目录
前言
决心当一名程序员的第一个月过去啦,得弊于大一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); //合并子问题 }