欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

算法-chapter2递归与分治-概述

程序员文章站 2022-07-14 22:04:02
...

算法-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); //合并子问题 }

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

算法-chapter2递归与分治-概述

相关标签: 算法