递归调用

python中的递归

爱⌒轻易说出口 提交于 2019-12-11 14:00:32
python中的递归 在函数内部调用自己本身就是递归 例如阶乘和累加 '''累加''' def sum ( n ) : if n == 1 : return 1 return n + sum ( n - 1 ) print ( sum ( 3 ) ) 运行结果 6 ===> sum(3) ===> 3 + sum(2) ===> 3 + (2 + sum(1)) ===> 3 + (2 + 1) ===> 6 '''阶乘''' def fact ( n ) : if n == 1 : return 1 return n * fact ( n - 1 ) print ( dact ( 3 ) ) 运行结果 6 ===> fact(3) ===> 3 * fact(2) ===> 3 * (2 * fact(1)) ===> 3 * (2 * 1) ===> 3 * 2 ===> 6 递归函数的优点是定义简单,逻辑清晰。 理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰 使用递归函数需要注意防止栈溢出 由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出 def sum ( n ) : if n == 1 : return 1 return n + sum ( n - 1 ) print ( sum ( 1000 ) ) 报错 RecursionError

递归文件

大憨熊 提交于 2019-12-10 21:09:43
public class DiGuiFile { public static void main(String[] args) { //给定的路径创建一个file对象 File srcfile = new File("D:\\code\\day0913"); //调用方法 getAllFilePath(srcfile); } //定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象 public static void getAllFilePath(File srcFile){ //获取给定的File目录下所有的文件或者目录的File数组 File[] fileArray = srcFile.listFiles(); //遍历该File数组,得到每一个File对象 if(fileArray != null){//首先判断集合是否为空 //判断该file对象是否是目录 for (File file : fileArray) {//超强for遍历对象 if(file.isDirectory()){ //是:递归调用 getAllFilePath(file); }else{ //不是:获取绝对路径输出在控制台.递归的出口 System.out.println(file.getAbsolutePath()); } } } }} 来源: https://www

php 递归函数的三种实现方式

孤人 提交于 2019-12-10 19:14:10
递归函数是我们常用到的一类函数,最基本的特点是 函数自身调用自身 ,但必须在调用自身前 有条件判断 ,否则无限无限调用下去。 利用引用做参数 function test($a=0,&$result=array()){ $a++; if ($a<10) { $result[]=$a; $this->test($a,$result); } echo $a; return $result; } 利用全局变量   利用全局变量完成递归函数,要理解什么是全局变量。global在函数内申明变量不过是外部变量的同名引用。变量的 作用范围仍然在本函数范围 内。改变这些变量的值,外部同名变量的值自然也改变了。但一旦用了&,同名变量不再是同名引用。利用全局变量实现递归函数没必要理解到这么深的一层,还保持原有对全局变量的看法就可以顺理成章理解递归函数。 function test($a=0,$result=array()){ global $result; $a++; if ($a<10) { $result[]=$a; $this->test($a,$result); } return $result; }   利用静态变量    我们常常在类中见到static,今天我们把它利用到递归函数中。请记住static的作用:仅在 第一次调 用函数的时候对变量进行 初始化 ,并且 保留变量值 。

算法导论 第7章 课后习题

早过忘川 提交于 2019-12-10 04:30:48
7.2-4 银行经常按照交易时间,来记录有关某一账户的交易情况,但是,很多人喜欢按照票据号来收到其银行对账单。因此,如何将按交易时间排序转换成按支票编号来排序,就成为一个对几乎排好序的输入进行排序的问题。证明在这个问题上,过程INSERT-SORT的性能往往优于过程QUIKSORT。 问题解析: 对于QUIKSORT来说,输入一个已排序的数组属于最坏的情况,则每次区间划分都是最大程度的不对称。其算法运行的递归时间为T(n) = T(n-1) + Θ(n), 算法时间复杂度为Θ(n^2); 而对INSERT-SORT来说,输入一个已排序的数组却属于最佳的情况,算法时间复杂度为O(n)。也就是说当输入一个几乎排好序的数组,快速排序趋于最坏的情况,而插入排序却趋于最佳的情况。为降低这种最坏情况出现的概率,采用快速排序随机化版本,期望的运行时间为O(nlgn)。 7.3-2 在过程RANDOMIZED-QUIKSORT的运行过程中,最坏情况下对随机排序产生器RANDOM调用了多少次?最佳情况下调用了多少次?以Θ记号形式个给出你的答案。 问题分析: 随机快速排序中,只要区间包含元素数目大于1,则需调用RANDOMIZED-PARTITION,选取主元(pivot)进行区间划分, 而主元的选取需调用Random。主元(pivot)一旦被选出来后,就不会在加入到后续的排序了。直白来说就是

递归

只谈情不闲聊 提交于 2019-12-10 03:22:36
递归应用场景 看个实际应用场景,迷宫问题(回溯),递归(Recursion) 递归的概念 简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂问题,同时可以让代码变得简洁。 递归的调用机制 1. 打印问题 /** * 打印问题 * @param n */ public static void test ( int n ) { if ( n > 2 ) { test ( n - 1 ) ; } System . out . println ( "n=" + n ) ; } 测试 public static void main ( String [ ] args ) { //通过打印问题,回顾递归调用机制 test ( 4 ) ; 2. 阶乘问题 /** * 阶乘问题 */ public static int factoriial ( int n ) { if ( n = = 1 ) { return 1 ; } else { return factoriial ( n - 1 ) * n ; } } 测试 public static void main ( String [ ] args ) { //通过打印问题,回顾递归调用机制 //test(4); //通过阶乘问题,回顾递归调用机制 int res = factoriial ( 2 ) ;

递归算法Recursion

亡梦爱人 提交于 2019-12-10 01:59:23
递归是一种常见的解决问题的方法,即把问题逐渐简单化。基本思想就是自己调用自己。 一个使用递归技术的方法将会直接或者间接的调用自己 void test01(){   test01();//自己调用自己就是递归   } void test02(){} test01死循环,要确定什么时候停止调用 -定义递归头。 什么时候调用自己 -递归体 public class Test { static long factorial(int n){ if (n==1) { return 1; }else{ return n*factorial(n-1); } } public static void main(String []args){ System.out.println(factorial(5)); } } 来源: https://www.cnblogs.com/iyon/p/3186462.html

算法 递归

情到浓时终转凉″ 提交于 2019-12-09 19:39:02
算法 递归 一、基础知识 1、迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值 2、描述迭代的一种方法是使用显式循环,如while和for循环。另一种完全不同的迭代实现方式是递归 3、递归是一种技术,这种技术是指通过函数在执行过程中一次或者多次调用其本身,或者通过一种数据结构在其表示中依赖于相同类型的结构更小的实例。 4、递归算法效率可能没有循环高,但是可读性和代码简洁性更强! 5、函数执行导致嵌套函数的调用时, 参数、局部变量和执行位置信息压栈 ,调用结束后恢复。递归调用也是这样的过程。当函数的依次调用需要进行递归调用时,该调用被挂起,直到递归调用完成。 6、在python中,当一个函数被调用时,为此创建一个 活动记录或框架 的结构来存储信息。活动记录里面存储函数调用的参数和局部变量的命名空间。 函数调用自身时,也是两个不同的函数(不同命名空间)在交流。 7、如果一个函数的执行导致嵌套函数的调用(其他函数或者函数调用自身),前者的调用将被挂起,其 活动记录将存储源代码中的位置(源代码中调用函数代码的下一条指令的存储位置) ,这个位置是 调用函数返回后 将继续执行的 控制流 。return之后根据 活动记录(栈)中的参数、局部变量和源代码下一条指令的位置 ,执行对应的指令操作。 8

用C++编写简单绘图语言的语法分析器

喜夏-厌秋 提交于 2019-12-09 13:03:13
语法分析器 概述 从词法分析的角度看,语言是一个单词的集合,称之为正规集,单词是由一个个字符组成的线性结构;从语法分析的角度看,语言是一个句子的集合,而句子是由词法分析器返回的记号组成的非线性结构。反映句子结构的最好方法是树,常用的有分析树和语法树。分析语法结构的基本方法有两种: 自上而下 分析方法和 自下而上 分析方法。自上而下分析从根到叶子建立分析树,而自下而上分析恰好相反。在这两种情况下,分析器都是从左到右地扫描输入,每次读进一个记号。 与词法分析类似,语法分析也具有双重含义: ①规定句子形成的规则,也被称为语法规则。程序设计语言的大部分语法规则可以用上下文无关文法( Context Free Grammar , 简称 CFG )来描述。 ②根据语法规则识别记号流中的评议结构,也被称为语法分析。最有效的自上而下和自下而上的分析方法都只能处理上下文无关文法的子类,如 LL 文法和 LR 方法,但是它们已足以应付程序设计评议的绝大多数语法现象。 一、任务与目的 ·上机任务: 1 、使用 C/C++ 程序设计语言和递归下降子程序的方法编写该函数绘图语言的词法分析器。并要求设计一个语法分析器的测试小程序来调用自己编写的语法分析器测试各种不同的输入。 2 、语法分析的任务是在词法分析基础上,根据语言的语法规则,把词法符号分解成各类语法单位。语法分析所依据的是语言的语法规则

Spring-AOP源码分析随手记(二)

走远了吗. 提交于 2019-12-08 17:06:55
这次来分析下切面的执行过程。 1.怎么看? 怎么开始看源码呢?就直接从被增强的方法调用那里打断点,看看怎么执行的: 然后就来到了这: 2.初步分析 里面有段: if (this.advised.exposeProxy) { // Make invocation available if necessary. oldProxy = AopContext.setCurrentProxy(proxy); setProxyContext = true; } 就是上篇文章讲到的注解配置暴露代理对象,放到AopContext的ThreadLocal里去,之后就可以随时用 AopContext.currentProxy())取到代理对象。 接下来有段重要的: List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); 获取拦截器链,就是把这次相关的增强器转化成拦截器获取出来 然后: if (chain.isEmpty()) { // We can skip creating a MethodInvocation: just invoke the target directly // Note that the final invoker must be an

C++递归函数

巧了我就是萌 提交于 2019-12-08 09:26:06
C++递归函数 【递归,就是在运行的过程中调用自己】 比如:(点击了下面的递归,搜索结果还是递归) A.构成递归需具备的条件: 1.子问题须与原始问题为同样的事,且更为简单。 2.不能无限制的调用本身,必须有个出口,化简为非递归状况处理。 B.递归可以解决的问题: 阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解 C.递归的过程(图片来源见水印,侵删) 【递归的过程可以理解为,把一个复杂的问题转化为一个个的小问题,而小问题能转化为更简单的问题,直到达到递归的“终点”——递归边界。递归边界是递归问题的特殊案例或者简单的情况,通过递归边界向上一层一层的返回数据,结束递归】 D.递归实例 Example ①://阶乘 #include <iostream> using namespace std; int Leo(int n) { int sum = 1; if(1 == n)//递归终止条件 { return 1; } sum =n * Leo(n - 1); return sum;//返回阶乘的总和 } int main() { int num; cin >> num;//输入一个数 cout << Leo(num) << endl; //输出该数的阶乘 return 0; } /* *在求X的阶乘和时 *可以利用递归的思想