递归算法

初识递归

喜欢而已 提交于 2019-12-01 19:57:49
#递归函数 #了解什么是递归: 在函数中调用自身函数 #最大递归深度默认是996/997/998—— 是Python从内部角度出发做得限制 #能够看懂递归 #能知道递归的应用场景 #初识递归 —— #算法——二分查找法 #三级菜单——递归实现 # 如果递归次数太多,就不适合使用递归来解决问题 #递归的缺点:占内存 #递归的优点:会让代码变简单 例如下面一个小例子: # alex 多大 n =1 age(1) = age(2)+2 = age(n+1) +2 #alex比egon大两岁 # egon 多大 n = 2 age(2) = age(3)+2 =age = age(n+1) +2 #egon比wusir大两岁 # wusir 多大 n = 3 age(3) = age(4)+2 age = age(n+1) +2 #wusir比金老板大两岁 # 金老板 多大 n = 4 age(4) = 40 #金老板40了 # n = 4 age(4) = 40 # n < 4 age(n) = age(n+1) + 2 # def age(n): # if n == 4: # return 40 # elif n > 0 and n < 4: # return age(n+1) + 2 # # print(age(1)) #46 来源: https://www.cnblogs.com

[算法]阶乘

六月ゝ 毕业季﹏ 提交于 2019-12-01 18:39:30
#include <iostream> #include <cmath> using namespace std; //递归 //每个递归函数都必须有一个非递归初始值 //递归的第二式都是用较小自变量的函数值来表达较大自变量的函数值 //1.factorial 阶乘 //n! = 1 当 n=0 //n! = n(n-1);当n>0 //算法复杂度O(n) static int factorial(int n) { if (n == 1) return 1; return n * factorial(n - 1); } int main() { for (int i=1;i<=100;i++) { cout <<"i="<<i<<":"<< factorial(13) << endl; } cout << "hello world" << endl; return 0; } 来源: https://www.cnblogs.com/tailiang/p/11712603.html

Java 递归

醉酒当歌 提交于 2019-12-01 17:30:43
递归: 从形式上看,就是自己调用自己的函数 从内涵上说,他是规律的总结(数学归纳法) 特征:   (1).函数里面的代码中一定调用了函数本身   (2).递归函数很容易引起内存崩溃   (3).递归函数的效率不是太高   (4). 特别好理解,代码简洁 如何写:   (1).要找到递归函数的终结条件   (2).要总结规律   (3).时刻记住你写次函数的目的是什么。 爬虫: 广度优先的算法,深度优先的算法(递归方式的一种体现) 1 //1+2+3+。。。 2 public static int add(int num) { 3 if(num == 1) {return 1;} 4 return add(num-1)+num; 5 } 1 //1*2*3*。。。 2 public static int jc(int num) { 3 if(num == 0) {return 1;} 4 if(num == 1) {return 1;} 5 return jc(num-1)*num; 6 } 1 //费氏数列 兔子 2 public static int tuzi(int n) { 3 if(n == 1) {return 1;} 4 if(n == 2) {return 1;} 5 return tuzi(n-1)+tuzi(n-2); 6 } 1 //打印目录 2 public

后台开发面经1

白昼怎懂夜的黑 提交于 2019-12-01 15:42:13
1、八大数据结构及分类 1、数组 频繁查询,对存储空间要求不大,很少增加和删除的情况 2、栈 栈常应用于实现递归功能方面的场景,例如斐波那契数列 3、队列 因为队列先进先出的特点,在多线程阻塞队列管理中非常适用 4、链表 数据量较小,需要频繁增加,删除操作的场景 5、树 二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。 6、散列表 哈希冲突的问题,如果处理的不好会浪费大量的时间,导致应用崩溃 7、堆 因为堆有序的特点,一般用来做数组中的排序,称为堆排序 8、图 https://blog.csdn.net/yeyazhishang/article/details/82353846 因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后才换成了数组加红黑树的结构。 图是一种比较复杂的数据结构,在存储数据上有着比较 复杂和高效 的算法,分别有 邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构 2、堆栈特点及应用 栈:特点就是一个先进后出的结构。 队列:特点就是一个先进先出的结构。 栈的应用 :非常广泛,在CPU内部就有提供栈这个机制。主要用途: 函数调用和返回

排序算法

隐身守侯 提交于 2019-12-01 15:34:31
说道排序,我们经常提到时间复杂度和空间复杂度,那么什么是时间复杂度什么又是空间复杂度呢? 时间复杂度:时间复杂度是指执行这个算法所需要的计算工作量 求解算法的时间复杂度的具体步骤是:   ⑴ 找出算法中的基本语句;   算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。   ⑵ 计算基本语句的执行次数的数量级;   只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。   ⑶ 用大Ο记号表示算法的时间性能。   将基本语句执行次数的数量级放入大Ο记号中。   如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加 空间复杂度:空间复杂度是指执行这个算法所需要的内存空间   空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度;计算机上占用内存包括   程序代码所占用的空间,输入输出数据所占用的空间,辅助变量所占用的空间这三个方面。   程序代码所占用的空间取决于算法本身的长短,输入输出数据所占用的空间取决于要解决的问题,   是通过参数表调用函数传递而来,只有辅助变量是算法运行过程中临时占用的存储空间,与空间复杂度相关;   通常来说

CSP-J/S 知识点选的

戏子无情 提交于 2019-12-01 15:11:28
CSP-J/S 知识点选讲 信息学史及基本知识 一、信息学及计算机史 计算机的顶级奖项 :图灵奖 对信息科学做出突出贡献的大神 : 图灵 , 冯 · 诺伊曼 中国获图灵奖的大神 :姚期智(清华就有姚班,就是以他的名字命名的) 世界第一台电子计算机 :埃尼阿克(ENIAC),于1946年2月14日在美国宾夕法尼亚大学诞生。又被叫做电子管计算机。 二、关于编程 编程语言 : 分两类:面向对象和面向过程。 高级语言和低级语言的区别 : 高级语言需要编译运行,常数较大,运行速度慢。而低级语言常数极小,运行速度快。此外,高级语言更容易移植。 常见低级语言 : 汇编 面向对象的高级语言 : C++,Java,EIFFEL,Simula 67等。 面向过程的高级语言 : C,Fortran语言。 递归编程 : 递归是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题。简单来讲,就是“自身调用自身”(在函数中)。 P类/NP类/NPC类问题 : 1、P类问题:如果一个问题能找到一个在多项式时间内解决它的算法,那么这个问题就是P问题。 2、NP类问题:注意:NP问题 不是非P类问题 ,而是在多项式时间内验证一个解的问题。或者,我们可以将其理解为在多项式时间内猜出一个解的问题。 3、NPC类问题:定义如下:如果一个问题是NP问题

CSP-J/S 知识点选讲

两盒软妹~` 提交于 2019-12-01 13:39:46
CSP-J/S 知识点选讲 信息学史及基本知识 一、信息学及计算机史 计算机的顶级奖项 :图灵奖 对信息科学做出突出贡献的大神 : 图灵 , 冯 · 诺伊曼 中国获图灵奖的大神 :姚期智(清华就有姚班,就是以他的名字命名的) 世界第一台电子计算机 :埃尼阿克(ENIAC),于1946年2月14日在美国宾夕法尼亚大学诞生。又被叫做电子管计算机。 二、关于编程 编程语言 : 分两类:面向对象和面向过程。 高级语言和低级语言的区别 : 高级语言需要编译运行,常数较大,运行速度慢。而低级语言常数极小,运行速度快。此外,高级语言更容易移植。 常见低级语言 : 汇编 面向对象的高级语言 : C++,Java,EIFFEL,Simula 67等。 面向过程的高级语言 : C,Fortran语言。 递归编程 : 递归是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题。简单来讲,就是“自身调用自身”(在函数中)。 P类/NP类/NPC类问题 : 1、P类问题:如果一个问题能找到一个在多项式时间内解决它的算法,那么这个问题就是P问题。 2、NP类问题:注意:NP问题 不是非P类问题 ,而是在多项式时间内验证一个解的问题。或者,我们可以将其理解为在多项式时间内猜出一个解的问题。 3、NPC类问题:定义如下:如果一个问题是NP问题

深究递归和迭代的区别、联系、优缺点及实例对比

久未见 提交于 2019-12-01 10:58:05
深究递归和迭代的区别、联系、优缺点及实例对比 1. 概念区分 递归的基本概念 : 程序调用自身的编程技巧称为递归 , 是函数自己调用自己 . 一个函数在其定义中直接或间接调用自身的一种方法 , 它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决 , 可以极大的减少代码量 . 递归的能力在于用有限的语句来定义对象的无限集合 . 使用递归要注意的有两点 : 1) 递归就是在过程或函数里面调用自身 ; 2) 在使用递归时 , 必须有一个明确的递归结束条件 , 称为递归出口 . 递归分为两个阶段 : 1) 递推 : 把复杂的问题的求解推到比原问题简单一些的问题的求解 ; 2) 回归 : 当获得最简单的情况后 , 逐步返回 , 依次得到复杂的解 . 利用递归可以解决很多问题 : 如背包问题 , 汉诺塔问题 ,... 等 . 斐波那契数列为 :0,1,1,2,3,5... 由于递归引起一系列的函数调用 , 并且有可能会有一系列的重复计算 , 递归算法的执行效率相对较低 . 迭代 : 利用变量的原值推算出变量的一个新值 . 如果递归是自己调用自己的话 , 迭代就是 A 不停的调用 B. 2. 辩证看递归和迭代 所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问。 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈

第二章作业

旧时模样 提交于 2019-12-01 10:18:09
一、对分治思想的体会 1、帮助我们解决问题。 分治法,对大的问题拆封成规模较小的问题,我们求解小问题,再把小问题的答案合并起来,得出大问题的答案。大问题思考起来比较乱,犯迷糊,不易想到解决方法,比如汉诺塔问题。分解成小问题,我们就容易想出方法来解决问题 2、时间复杂度低 分治法思想核心是递归,递归的时间复杂度低。算法的复杂度低,提高了算法的质量 二、结对编程情况汇报 有一道题没有按时间复杂度为O(logn)编程,后来查找资料知道如何写出O(logn)的算法。锻炼了我以多种方式去思考问题,从而得出最好的答案。 来源: https://www.cnblogs.com/mhw-84/p/11680052.html

第二章总结和结对编程情况

℡╲_俬逩灬. 提交于 2019-12-01 09:02:56
第二章总结 1.递归 1.1递归是什么:递归是自己定义自己,直接或间接地调用自己的算法。 1.2递归常见类型:多变元递归、多步递归、嵌套递归、联立递归。 1.3优点:可读性强,结构清晰,为调试提供很大便利;   缺点:运行效率较低,空间复杂度和时间复杂度都耗费比较大。 2.分治 2.1分治是什么:把一个问题分成若干个相同的子问题,对子问题进行求解。 2.2.分治思想三个阶段:一个较大问题划分为多个子问题、求解子问题、合并子问题的解,形成原始问题的解。 2.3时间复杂度:当 n = 1 时,T(n) = O(1);当 n > 1 时,T(n) = kT(n / m)+ f(n)。 2.4例子应用:大整数的乘法、Strassen矩阵乘法、棋盘覆盖、合并排序、快速排序。 2.5自己对分治思想的体会:看代码的时候把例子的用到分治思想理解了就觉得很好用,但是自己很难去实现分治算法的三步走,一是经验太少,怎么划分问题没有头绪;二是解决问题和合并解的时候思路不清晰,写代码的时候容易把自己绕晕。另外对求空间复杂度记不住,看一次记一次,没有理解透彻。自己尝试先理解代码然后背代码,再试着自己解释代码。 结对编程情况 由于自己对算法有点弱,和队友编程时两个人的思路都比较混乱,然后互相可能都不能理解队友的思路,两个人都有点难受。不过相比于一个人自己编程,会有被督促的感觉,这点算是对我来说比较好的一个方面。