递归

Python__高级

孤街浪徒 提交于 2020-03-07 09:27:32
一.元类 1.Python 中类方法、类实例方法、静态方法有何区别? 类方法 :是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为 cls,表示类对象,类对象和实例对象都可调用; 类实例方法 :是类实例化对象的方法,只有实例对象可以调用,形参为 self,指代对象本身; 静态方法 :是一个任意函数,在其上方使用“@staticmethod”进行装饰,可以用对象直接调用,静态方法实际上跟该类没有太大关系。 2.Python 中如何动态获取和设置对象的属性? if hasattr(Parent,'x'): print(getattr(Parent,'x')) setattr(Parent,'x',3) print(getattr(Parent,'x')) 二.内存管理与垃圾回收机制 1. Python 的内存管理机制及调优手段? 内存管理机制:引用计数、垃圾回收、内存池。 引用计数:引用计数是一种非常高效的内存管理手段, 当一个 Python 对象被引用时其引用计数增加 1, 当 其不再被一个变量引用时则计数减 1. 当引用计数等于 0 时对象被删除。 1. 引用计数 引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。当 Python 的某 个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比

SQL 递归查询

℡╲_俬逩灬. 提交于 2020-03-07 04:53:12
SELECT id FROM T START WITH T.id = '0' CONNECT BY PRIOR T.id= T.pid 机构表 主键 名字 上机构id id name pid 1000 一级机构 0 1001 二级机构 1000 1002 三级机构1 1001 1003 三级机构2 1001 来源: CSDN 作者: CarsonJava 链接: https://blog.csdn.net/Carson073/article/details/104696826

计算方法之递归分治

廉价感情. 提交于 2020-03-07 04:28:39
一.全排列问题 问题描述: 有一组数R,需要输出它的全排列。R的递归可定义如下: 当个数n为1时,Perm® = ®,其中r是集合R中唯一的元素 当个数n大于1时,Perm®由(r1)Perm(R1),(r2)Perm(R2),(r3)Perm(R3),…,(rn)Perm(Rn)构成 其中Ri = R - {ri} 即该集合中减去对应元素 思路: 看上面的问题描述几乎就懵掉了。说的乱乱的,我在这用通俗易懂的方法解释一下。比如说有四个数1,2,3,4,那也就是说对应有四个位置。首先第一个位置有四种选择,可以放1,2,3,4。当放1的时候,还剩下3个位置对应三个数2,3,4,那第二个位置就对应3个选择2,3,4;当第二个位置放2的时候还剩下两个数3,4,此时第三个位置有两个选择放3或4;当我们放3的时候,还剩下一个位置一个数4,那第一种就排好了1234,下一种情况就回到了刚刚第三个数两种选择,3我们选择过了,现在选择4放在第三个位置,那第四个位置也就确定了,此时是1243,再回到第二个位置选择,以此类推。 输出的顺序是: 1234 1243 1324 1342 1432 1423 2134 2143 2314 2341 2431 2413 3214 3241 3124 3142 3412 3421 4231 4213 4321 4312 4132 4123 代码: public

机试指南第八章 递归与分治

送分小仙女□ 提交于 2020-03-07 03:24:57
P135习题 8.1 # include <iostream> using namespace std ; int factorial ( int n ) { if ( n == 1 ) { return n ; } else { return n * factorial ( n - 1 ) ; } } int zuheshu ( int m , int n ) { return factorial ( m ) / ( factorial ( n ) * factorial ( m - n ) ) ; } int main ( ) { //freopen("D://case.txt","r",stdin); int cas ; cin >> cas ; cout << "1 1" << endl ; int m , n ; for ( m = 2 ; m < cas ; m ++ ) { cout << "1 " ; for ( n = 1 ; n <= m - 1 ; n ++ ) { cout << zuheshu ( m , n ) << ' ' ; } cout << '1' << endl ; } return 0 ; } P135习题 8.2 STL自带全排列 # include <bits/stdc++.h> using namespace std ; int

LeetCode- 93. 复原IP地址

折月煮酒 提交于 2020-03-07 02:55:57
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 示例: 输入: "25525511135" 输出: ["255.255.11.135", "255.255.111.35"] DFS,思路:考虑满足ip地址的要求,必须放置三个点 " . ",将字符串分割成4段。 于是我们可以遍历每个字符间隔放置 " . " 的前一个字串是否满足要求,如果满足,则 继续放置 ".",存储合法字串,一直到最后用完3个".",之后判断尾部的字符串就可以了, 如果不满足,抛弃当前上一个字串,重新遍历 "."的位置。 这里我说明一下,为什么当前不满足,要抛弃上一个已经合法的字串,大家可以看我写的JudgeIsIp 函数,其实出现违法的情况就只有下面几种: 1.字符串长度大于3。(虽然判了小于0的情况,但是根据递归顺序,字符串字串不可能小于0) 2.字符串数字大于255。 3.字符串大于1且首字母为0。 如果满足这三个条件是一定无法构成ip地址的,并且随着递归顺序增加,"."的位置只会到更后边,本次循环的下一个字串必定非法,所以没毕业继续进行本次循环,return,满足上一个合法字符穿字串的操作已经进入递归,所以上一个合法字符字串必须舍弃,重新排列。 #include <iostream> #include <vector> #include <string> using

练习10-1 使用递归函数计算1到n之和 (10分)

烂漫一生 提交于 2020-03-07 02:42:14
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。 函数接口定义: int sum( int n ); 该函数对于传入的正整数 n 返回 1+2+3+…+n 的和;若 n 不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。 裁判测试程序样例: #include <stdio.h> int sum( int n ); int main() { int n; scanf("%d", &n); printf ("%d\n", sum(n)); return 0; } /* 你的代码将被嵌在这里 */ 输入样例1: 10 输出样例1: 55 输入样例2: 0 输出样例2: 0 解答: int sum( int n ){ if(n<=0) return 0; if(n==1) return 1; return n+sum(n-1); } 来源: CSDN 作者: youandworld 链接: https://blog.csdn.net/qq_30377869/article/details/104705019

求解递归式时间复杂度

梦想的初衷 提交于 2020-03-07 00:06:43
方法一:代换法(代入法) 这种方法分为两个步骤: 1、 猜答案 ,我们只需要猜一下大致的形式 比如 T(n)= 4T(n/2) +n 通过观察该递归式,注意到当n加倍时,输出增加4倍,于是猜测该递归式时间复杂度为O(n 2 ),即T(n) = O(n 2 ) 。 2、 数学归纳法证明 我们用带常数系数的展开 T(k) ≤ c 1 k 2 -c 2 k(k<n) T(n) ≤4[c 1 (n/2) 2 -c 2 (n/2)]+n=c 1 n 2 +(1-2c 2 )n = c 1 n 2 -c 2 n-(c 2 -1)n≤c 1 n^2-c 2 n 这里我们就得到了时间复杂度O(n 2 ) 那么我们为什么不用ck 2 呢,看上式看不出来的话,可以推导一下,化简为 cn 2 +n,这个式子我们得不到T(n) ≤cn 2 ,所以通过降阶来实现(算时间复杂度我们只考虑高阶,不用管低阶) 方法二:递归树法(迭代法) 这个应该式比较好理解的了吧,就是一项一项展开,项数以等比数列方式增长(d k-1 ,每次可以递归d次,k为递归的层数),这里的话就可以理解成 满d叉树 。 来源: CSDN 作者: 萌小兔~ 链接: https://blog.csdn.net/weixin_44417475/article/details/104703670

【算法题】用栈来解决汉诺塔问题

[亡魂溺海] 提交于 2020-03-06 23:56:48
用栈来解决汉诺塔问题 题目 修改汉诺塔问题的游戏规则:限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间。求当塔有N层的时候,打印最优移动和最优移动总步数。 要求: 方法一:递归的方法 方法二:非递归的方法,用栈来模拟汉诺塔的三个塔 思路 方法一:递归的方法 首先,如果只剩最上层的塔需要移动,则有如下处理: 如果希望从左移动到右,打印Move 1 from left to right 如果希望从中移动到左,打印Move 1 from mid to left 如果希望从中移动到右,打印Move 1 from mid to right 如果希望从右移动到中,打印Move 1 from right to mid 如果希望从左移动到右,打印Move 1 from left to mid Move 1 from mid to right 如果希望从右移动到左,打印Move 1 from right to mid Move 1 from mid to left 以上就是递归的终止条件,也就是只剩上层塔时的打印过程。 多层塔的时候。 如果剩下N层塔,从最上到最小依次为1~N-1,则有如下判断 如果剩下的N层塔都在左,希望全部移到中,则有三个步骤 1)将1~N-1层塔先全部从左移动到右,交给递归过程 2)将第N层塔从左移到中 3)将1~N-1层塔全部从右移到中

java 实现二分法

谁说胖子不能爱 提交于 2020-03-06 21:46:38
http://www.cnblogs.com/vanezkw/archive/2012/06/29/2569470.html JDK里面的二分法实现。二分法的实现有多种今天就给大家分享两种。一种是递归方式的,一种是非递归方式的。先来看看一些基础的东西。 1、算法概念。 二分查找算法也称为折半搜索、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。请注意这种算法是建立在有序数组基础上的。 2、算法思想。 ①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束; ②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。 ③如果在某一步骤数组为空,则代表找不到。 这种搜索算法每一次比较都使搜索范围缩小一半。 3、实现思路。 ①找出位于数组中间的值,并存放在一个变量中(为了下面的说明,变量暂时命名为temp); ②需要找到的key和temp进行比较; ③如果key值大于temp,则把数组中间位置作为下一次计算的起点;重复① ②。 ④如果key值小于temp,则把数组中间位置作为下一次计算的终点;重复① ② ③。 ⑤如果key值等于temp,则返回数组下标,完成查找。 4、实现代码。 /** * description : 二分查找。 * @autor kwzhang * modify :2012-6

python-使用递归实现二分法

巧了我就是萌 提交于 2020-03-06 21:45:38
在上一篇中简单介绍了递归的使用, 请戳这里 。 在此篇中,主要介绍如何用递归实现二分法。 在使用二分法之前,首先要有个前提,那就是这个数组必须是 有序数组 。主要的思路为:   ①先取出数组中的一个中间值, 和我们需要找的数字进行对比,如果恰好相等,则说明找到该数字,如果数组的中间值大于需要查找的数组,接下来的查找范围就为中间值之前的数组。反之为中间值之后的数组  ②对数组不断的缩小范围,最后当数组中只有一个数字时,再进行比较,如果相等,则找到,否则需要查找的数字就不在我们的数组中。 代码如下: def binary_search(data_source, find_number): """定义二分法""" mid = int(len(data_source)/2) #先取数组中的中间值 if len(data_source) > 1: #判断整个数组中的数字个数 if data_source[mid] > find_number: print('data is left of %s' % data_source[mid]) binary_search(data_source[:mid], find_number) elif data_source[mid] < find_number: print('data is right of %s' % data_source[mid])