笔记一:递归

一开始讲了算法的空间复杂度和时间复杂度的分析,其怎么由来的,一步步的分析演变,以前看过《算法之道》,这个还有点熟悉,就是具体的例子的时间复杂度的分析不怎么

会,应多加练习,毕竟

这是很基础的东西~

然后就是递归和分治~ 今晚只够时间讲递归~

其实,都看过递归~以前刚刚开始接触的时候觉得很容易,慢慢的就很难了,就是实现代码的时候碰到了思维障碍,过不去,大二时就学过递归~很重要的基础

以前的印象是调用自身,“推卸责任”,数学公式,递归图,经典的Fibonacci数列~

以前就是看或写递归代码的时候就会遇到思维障碍,这很难说明,但就是要理解其中的一个环节时卡住了,不明白为什么~

通过今晚的课,我想,也许是我认识理解递归算法的方式错误了~应该充分的把握其本质(要拿出来用时最直接接触的本质)和“不求甚解”~

今晚,老师将了递归的空间本质,其实就是一个栈,临界结束条件在最顶层,最底层的是n的情况,这个就像是个手榴弹一样,最顶的就是个保险环,我们要写的代码就是保险

环(临界结束条件)和炸药(递归关系,反应链)~这个记忆很重要,因为明确了要写的是什么,就不会出现思维障碍了~理解起来就顺了,要写怎么样的递归代码就一目了然了~

写递归代码,要先推出临界结束条件和递归关系式,然后再去实现代码!!!要分析递归的时间复杂度也是要先写出递归式分析!!!递归:重在“归”和化归差不多!

比如,Fibonacci数列f[n]=f[n-1]+f[n-2],分析的话,就是T(n)变为两个T(n)(T(n-1)和T(n-2)都看为T(n)),就是T(n)=2T(n)+O(1),

每个T(n)都变为2T(n),有n个,即是O(2^n)的复杂度~(其中还有一个O(n),忽略不计)~<注意!这里的两个字“变为”是很重要的思想!!!>

还有就是讲了全排列~很经典~

perm(n)=(变为)rn(perm(n-1))+rn-1(perm(n-1))......r0(perm(n-1))

递归算法,几乎都是找f(n)和f(n-1)或f(n/2)等等的关系!

我相信其实这些都很简单,我知道我所理解的方向不对,即是打开的方式不对罢了,所以才会学算法这么慢!!!加油!!!

时间: 2024-10-14 16:59:54

笔记一:递归的相关文章

Python学习笔记 之 递归、二维数组顺时针旋转90&#176;、正则表达式

递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多容易造成栈溢出 要求: 每次调用递归规模上有所减小 前一次为后一次做准备 规模较小时必须直接给出解答而不再进行递归调用 例子:递归实现二分法 1 def searchMyData(mydate,a1): 2 mid = int(len(mydate)/2) 3 if mid >= 1: 4 if m

算法笔记_017:递归执行顺序的探讨(Java)

目录 1 问题描述 2 解决方案 2.1 问题化简 2.2 定位输出测试 2.3 回顾总结 1 问题描述 最近两天在思考如何使用蛮力法解决旅行商问题(此问题,说白了就是如何求解n个不同字母的所有不同排序的序列问题,即共有n!次不同排序). 为此,我认真看了一篇出自CSDN上的博客文章,其中有一段核心代码就是在for循环里面添加一句递归调用语句,来实现n!次排序.因此,我对文章中的那段核心代码苦苦不得其解--其执行顺序究竟是咋样的呢? 附其简要代码: public int count = 0; p

个人笔记:PHP递归删除指定目录下的文件和目录

function DelDir($path){ //给定的目录不是一个文件夹 if(!is_dir($path)){ return null; } // 1 打开目录 $dir =opendir($path); // 去除. 和.. while ($filename =readdir($dir)) { if ($filename =='.' || $filename == '..') { continue; } // 拼接完整路径,不拼接会到当前路径下找 $filepath =$path.'/'

Python练习笔记——利用递归求年龄,第五个比第四个大2岁...

现在有五个人, 第五个人比第四个人大两岁,18 第四个人比第三个人大两岁,16 第三个人比第二个人大两岁,14 第二个人比第一个人大两岁,12 第一个人现10岁,                 10 第五个人的年龄是多大(采用递归函数计算) def age(n): # n 表示第几个人 if n == 1: return 10 return 2 + age(n-1) print(age(5)) 输出:18

SQL 笔记 By 华仔

-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据库的大小的方法 笔记3-徐 设置数据库自动增长注意要点 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat 笔记5-徐 检查日志文件不能被截断的原因 笔记6-徐 检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题 笔记7-徐 SQLSERVER日志记录

算法笔记_023:拓扑排序(Java)

目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进行排序.即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面. 2 解决方案 2.1 基于减治法实现 实现原理:不断地做这样一件事,在余下的有向图中求取一个源(source)(PS:定义入度为0的顶点为有向图的源),它是一个没有输入边的顶点,然后把它和所有从它出发

算法笔记_018:旅行商问题(Java)

目录 1 问题描述 2 解决方案 2.1 蛮力法   1 问题描述 何为旅行商问题?按照非专业的说法,这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到触发的城市之前,对每个城市都只访问一次.这样该问题就可以表述为求一个图的最短哈密顿回路的问题.(哈密顿回路:定义为一个对图的每个顶点都只穿越一次的回路) 很容易看出来,哈密顿回路也可以定义为n+1个相邻顶点v1,v2,v3,...,vn,v1的一个序列.其中,序列的第一个顶点和最后一个顶点是相同的,而其它n-1个顶点都是互不相同的.并且

Python学习——复习5次课(12月2日)

任务: 复习5次课(12月2日) 1.8 递归列出目录里的文件1.9 匿名函数2.0-2.4 内建函数 笔记: 递归的注意事项必须有最后的默认结果 if n == 0递归参数必须向默认结果收敛的: factorial(n-1) 递归列出目录里的文件def print_files(path): isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join lsdir = os.listdir(path) dirs = [i fo

wc.exe指令(C++)

https://github.com/kielingpao/wc 项目相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数.单词数和行数. 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件.具体功能要求:程序处理用户需求的模式为: wc.exe [parameter] [file_name] 基本功能

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以