递归调用

Python之函数进阶

一世执手 提交于 2019-12-26 21:37:17
本节内容 上一篇中介绍了Python中函数的定义、函数的调用、函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一、递归函数 函数是可以被调用的,且一个函数内部可以调用其他函数。如果一个函数在内部调用本身,这个函数就是一个递归函数。函数递归调用的过程与循环相似,而且理论上,所有的递归函数都可以写成循环的方式,但是递归函数的优点是定义简单,逻辑清晰。递归和循环都是一个重复的操作过程,这些重复性的操作必然是需要有一定的规律性的。另外,很明显递归函数也需要一个结束条件,否则就会像死循环一样递归下去,直到由于栈溢出而被终止(这个下面介绍)。 可见,要实现一个递归函数需要确定两个要素: 递归规律 结束条件 1. 实例:计算正整数n的阶乘 n! = 1 * 2 * 3 * ... * n 循环实现 思路有两个: 从1乘到n,需要额外定义一个计数器存放n当前的值 从n乘到1,无需额外定义计数器,直接对n进行减1操作,直到n=0返回1结束 def fact(n): if n == 0: return 1 result = 1 while n >= 1: result *= n n -= 1 return result 递归实现 先来确定递归函数的两个要素: 递归规律:n!=1 * 2 * 3 * ... * n = (n

07-08 函数递归

余生颓废 提交于 2019-12-26 14:43:52
[TOC] 一 函数递归调用介绍 函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身 插图:恶搞图58 例如 在调用f1的过程中,又调用f1,这就是直接调用函数f1本身 def f1(): print('from f1') f1() f1() 配图:递归调用1 在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接调用函数f1本身 def f1(): print('from f1') f2() def f2(): print('from f2') f1() f1() 配图:递归调用2 从上图可以看出,两种情况下的递归调用都是一个无限循环的过程,但在python对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,要避免出现这种情况,就必须让递归调用在满足某个特定条件下终止。 提示: #1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用 sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制 #2. python不是一门函数式编程语言,无法对递归进行尾递归优化。 插图:恶搞图59 二 回溯与递推 下面我们用一个浅显的例子

实验二 递归下降语法分析

折月煮酒 提交于 2019-12-26 10:45:56
一、实验目的: 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验原理 每个非终结符都对应一个子程序。 该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端: 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理 每遇到一个非终结符,则调用相应的子程序 三、实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。 例如: 输入begin a:=9;x:=2*3;b:=a+x end # 输出success 输入x:=a+b*c end # 输出‘end' error 四、实验步骤 1.待分析的语言的语法(参考P90) 2.将其改为文法表示,至少包含 –语句 –条件 –表达式 3. 消除其左递归 4. 提取公共左因子 5. SELECT集计算 6. LL(1)文法判断 7. 递归下降分析程序 #include <iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> char prog[80],token

尾递归是个什么鬼

自古美人都是妖i 提交于 2019-12-26 08:49:21
“普通程序员使用迭代,天才程序员使用递归” 大家都说递归好用,却也都在抱怨递归过程占用内存的弊病。   以上是博主学习编程以来一直困惑的问题,能不能使用外部给的一个储存空间,使用一种近似for循环的机制解决递归爆栈,但是总有一些细节感觉不妥。这过程中内存问过一些比我牛的大佬,仍没能得以解决,知道在《图解算法》中看到“尾递归”这三个字。。。 聊聊尾递归,说尾递归,首先要说说尾调用和递归这两个小概念:   “尾调用”是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下该调用位置为尾位置。(维基百科这样解释)   “递归”就是程序不断的调用自己本身,递归函数调用顺序:         a.调用开始前,调用方(或函数本身)会往栈上压相关的数据,参数,返回地址,局部变量等         b.执行函数         c.清理栈上相关的数据,返回   “尾递归”:顾名思义,就是兼顾“尾调用”和“递归”两者优点的一种不同的“递归”。这一种依赖于编译器的帮助实现的递归方式,并不是每一种语言都可以实现。       C语言可以实现,python就不能实现这种很奇妙的递归方式。 尾递归了解了,防止递归爆栈的方式也知道了,但是python中的递归内存问题还是本人的困惑,希望有一天,能和龟叔级别的人物聊聊类似的问题的解决方案。 努力更新中。。。

使用递归原理根据文件夹路径,删除文件夹

浪子不回头ぞ 提交于 2019-12-25 23:11:35
在实际开发中往往会有删除某个目录的需求,而如果直接删除目录程序会报错,正确的删除方式应该是先删除该目录里的所有文件,再删除该目录。 本篇博文通过递归的方式将整个目录以及其中的文件夹全部删除,具体实例如以下代码所示: package com.sjk.sheng; import java.io.File; public class Example { public static void main(String[] args) { //创建一个代表目录的file对象 File file = new File("F://sjk.txt"); //调用deleteDir删除方法 deleteDir(file); } public static void deleteDir(File dir) { //判断传入的File对象是否存在 if(dir.exists()) { //得到File数组 File[] files = dir.listFiles(); //遍历所有的子目录和文件 for(File file : files) { if(file.isDirectory()) { //如果是目录,递归调用deleteDir() deleteDir(file); } else { //如果是文件,直接删除 file.delete(); } } //删除完一个目录里的所有文件后,就删除这个目录

VUE递归组件使用事例

风流意气都作罢 提交于 2019-12-25 22:59:41
概念: 组件是可以在它们自己的模板中调用自身的。不过它们只能通过 name 选项来做这件事。 之前在写组件时总有些疑惑,为什么export default导出的对象中有个name属性,今天看过递归组件之后,才发现这个name属性的一个比较重要的作用。(当然。name属性的还有其他的用处)。 用法: 1、首先我们要知道,既然是递归组件,那么一定要有一个结束的条件,否则就会使用组件循环引用,最终出现“max stack size exceeded”的错误,也就是栈溢出。那么,我们可以使用v-if="false"作为递归组件的结束条件。当遇到v-if为false时,组件将不会再进行渲染。 既然要用递归组件,那么对我们的数据格式肯定是需要满足递归的条件的。就像下边这样,这是一个树状的递归数据。 1 [ 2 { 3 "name": "黄焖鸡米饭111111111", 4 cList: [ 5 { "name": "二级黄焖鸡" }, 6 { 7 "name": "one chicken", 8 cList: [{ "name": '三级黄焖鸡3333', cList: [{ "name": "四级黄焖鸡" }] }] 9 } 10 ] 11 }, 12 { "name": "2222222222" }, 13 { 14 "name": "黄焖鸡米饭33333333", cList: [ 15

转(Java中的递归思想)

纵饮孤独 提交于 2019-12-25 22:38:35
解释:程序调用自身的 编程 技巧叫做递归。 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。 递归的三个条件: 边界条件 递归前进段 递归返回段 当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 下面通过两个示例程序来说明: 使用 Java 代码求5的阶乘。(5的阶乘=5*4*3*2*1) [java] package org.wxp.recursion; /** * 计算5的阶乘(result = 5*4*3*2*1) * @author Champion.Wong * * */ public class Test01 { public static void main(String[] args) { System.out.println(f(5)); } public static int f(int n) { if (1 == n) return 1; else return n*(n-1); } } 此题中,按照递归的三个条件来分析: (1

PHP无限极分类原理

我怕爱的太早我们不能终老 提交于 2019-12-25 19:02:21
1.递归:程序调用自身的编程技巧称为递归 2.案例: /** * @param 递归 $[name] */ function deeploop(&$i=1){ echo $i; $i++; if($i < 10){ deeploop($i); } } deeploop(); 结果:123456789 3.global /** * @param 递归 $[name] */ $i = 1; function deeploop(){ global $i; //Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。 echo $i; $i++; if($i < 10){ deeploop($i); } } deeploop(); 4.static /** * @param 递归 $[name] */ function deeploop(){ static $i; echo $i; $i++; if($i < 10){ deeploop($i); } } deeploop(); 5.说白了递归就是一个循环,用循环实现和递归实现是同样的效果。 /** * @param 递归 $[name] */ for($i=1;$i<10;$i++){ echo $i; } function deeploop(){

用递归的方法实现无限极分类

和自甴很熟 提交于 2019-12-25 18:53:44
通常我在写项目的时候,在写一些例如商城分类的时候会实现对应分类的上级分类,或者其它项目部门管理的上级部门的时候一般就会用到无限极分类来进行分类 第一步:首先在数据表设计的时候,如果要实现无限极分类,一般我会在数据表多添加一个字段pid,下面我通过一张新建的数据表来说明一下, (1)建表: -- ---------------------------- -- Table structure for pid -- ---------------------------- DROP TABLE IF EXISTS `pid`; CREATE TABLE pid ( id tinyint unsigned NOT NULL AUTO_INCREMENT primary key comment '主键id', name varchar(32) NOT NULL, nickname varchar(32) DEFAULT NULL, pid tinyint(10) unsigned DEFAULT NULL, sort mediumint(10) unsigned DEFAULT 50 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; (2)插入数据: -- ---------------------------- -- Records of pid -- -----

无限极分类中递归查找一个树结构

倖福魔咒の 提交于 2019-12-25 18:53:11
问题:设计公司的员工表,员工有不同级别,要求可通过一个员工查到其下属的所有员工,也可查到其所属的上级。 解决:递归实现无限分类思想,每一个员工存入其所属的上级的id作为自己的pid,另外存入path,path包含自身id,方便显示路径。 递归的注意点: 1.一定有一个判断条件,否则递归就死循环了 2.每次的递归结果要保存起来,变量自增的实现三种方式: function(&$bar):通过引用地址 global :通过设置为全局变量 static :设置为静态变量 header( "Content-type: text/html; charset=utf-8" ); $arr = array( array( 'uid'=>'1', 'name'=>'总监张', 'pid'=>'0', 'path'=>'0,' ), array( 'uid'=>'2', 'name'=>'副总王', 'pid'=>'1', 'path'=>'0,1,' ), array( 'uid'=>'3', 'name'=>'经理赵', 'pid'=>'2', 'path'=>'0,1,2,' ), array( 'uid'=>'4', 'name'=>'员工赵', 'pid'=>'6', 'path'=>'0,1,2,3,6,' ), array( 'uid'=>'5', 'name'=>'员工房', 'pid