递归调用

39 py函数作用域递归函数 变量作用域局部函数 使用lambda

天涯浪子 提交于 2020-01-10 18:11:37
第十课:函数作用域 // python 中的嵌套函数 在一个函数中再定义一个函数 # 小结 : # 函数作用域:因为:python是动态语言,定义变量的时候是不需要指定变量类型的,这样的话,我们在使用或者定义变量的时候作用域会分不清 # 如果在函数中定义一个变量,而且变量名和该函数上一级的作用域中的变量名相同 # 那么在该函数使用该变量时,就会使用局部变量 # 如果在函数中使用一个变量,但该变量在函数中并没有定义,那么会到该函数上一层的作用域去寻找该变量,如果还没有找到,会继续到上一层作用域去寻找,如果没找到会抛出变量未定义异常 x = 10 # 定义了一个变量 并赋值 def fun1(): x = 100 fun1() print(x) # 10 y = 123 def fun2(): print(y) fun2() # 123 在函数中,如果在函数体中没有定义变量的话,首先会在函数体中去找 变量的值,如果没有,就找全局的作用域去找 n = 332 def fun3(): n = 4 print(n) fun3() # 4 这个和第一个例子有什么区别呢? 多了一个 print(n) 其实这个就是局部作用域,在调用函数的时候就已经算出值了。 def fun4(): print(n) n = 100 # fun4() 抛出异常 # 定义一个嵌套函数 m = 10 def fun5(

[Day22]IO(File、递归)

╄→尐↘猪︶ㄣ 提交于 2020-01-10 10:55:33
1.File   1.1 IO概述   (1)当需要把内存中的数据存储到持久化设备上的这个动作称为输出(写)Output操作   (2)当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作   1.2 File类-Java中把文件或目录(文件夹)都封装成 File对象   1.3 File类的构造函数   (1) File(File parent,String child)   根据parent抽象路径名和child路径名字符串创建一个新File实例   (2) File(String pathname)    通过将给定路径名字符串转换为抽象路径名来创建一个新File实例   (3) File(String parent,String child)   根据parent路径字符串和child路径名字符串创建一个新File案例   1.4 File类的获取   (1) String  getAbsolutePath()   返回此抽象路径名的绝对路径名字符串   (2) String  getName()   返回由此抽象路径名表示的文件或目录的名称   (3) String  getPath()   将此抽象路径名转换为一个路径名字符串   (4) long  length()   返回由此抽象路径名表示的文件的长度   1.5 文件和文件夹的创建删除等   

day23 Java学习 File类递归练习

心已入冬 提交于 2020-01-10 05:10:15
File类递归练习统计: 计算文件夹大小: public static void main(String[] args) { //需求:从键盘接收一个文件夹路径,统计该文件夹大小 File dir=getDir(); System.out.println(getFileLength(dir)); } /*从键盘接收一个文件夹路径:*/ public static File getDir() { // 1.创建键盘录入对象 Scanner sc = new Scanner(System.in); System.out.println("请输入一个文件夹路径"); // 2.定义一个无限循环 while (true) { String line = sc.nextLine(); // 3.将录入结果存储并封装成File对象 File dir = new File(line); if (!dir.exists()) { System.out.println("录入的文件夹路径不存在,请从新输入:"); } else if (dir.isFile()) { System.out.println("你录入的是文件路径,请从新输入:"); } else { //5.将文件夹路径对象返回 return dir; } } } public static long getFileLength

数据结构之递归案例一

孤者浪人 提交于 2020-01-09 00:49:20
什么是递归? 顾名思义,所谓递归就是一个函数(或方法)自己调用自己,最简的如下: public void text() { text(); } 就是这么简单,但是一定要给这个递归函数一个出口,不然就会无限循环下去,最后的结果就是OutOfMemory(内存溢出),如果是在main函数中调用的话,就会出现栈空间已满的错误。 如何给一个递归的方法写一个出口呢? 只要在递归的过程中,有一个方法有一条return 语句,也就是有一个递归方法不再进行递归就会退出了。 我们给上方法添加一个返回的条件; private int count = 0; /* * 每次让count累加,当它等于4时,就返回,这样就能这个递归函数了 */ public void text() { if (count == 4) { return; } count++; text(); } 递归有什么用? 1.最著名的就是裴波那契数列 有如下问题:假设第一个月有一对刚出生的兔子,第二个月兔子进入成熟期,我三个月开始生育小兔子,而一对成熟的兔子会在每月生育一对小兔子,兔子永远不会死去。。。n月后会有多少只兔子 可以很容易地使用穷举来计算刚开始的几个月的兔子数 月份 1 2 3 4 5 6 7 兔子对数 1 1 2 3 5 8 13 使用递归来解决这个问题的思路分析: 很容易得到一个算式就是: 当n=0时,有0对兔子; 当n

IO【File、递归】

懵懂的女人 提交于 2020-01-08 22:49:02
微信公众号: 菜鸟永恒 欢迎关注 第10天 File,递归 今日内容介绍  File  递归 今日学习目标  能够说出File对象的创建方式  能够说出File类获取名称的方法名称  能够说出File类获取绝对路径的方法名称  能够说出File类获取文件大小的方法名称  能够说出File类判断是否是文件的方法名称  能够说出File类判断是否是文件夹的方法名称  能够辨别相对路径和绝对路径  能够遍历文件夹  能够解释递归的含义  能够使用递归的方式计算5的阶乘  能够说出使用递归会内存溢出隐患的原因 第1章 File 在我们操作系统中,数据都保存在文件中,而文件存放相应的文件夹中。那么Java中是如何描述这些的呢? 1.1 File类的出现 打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢? 1.2 File类的构造方法  通过构造方法创建File对象,我们进行演示: public class FileDemo { public static void main(String[] args) { /

五大常见算法策略之——递归与分治策略

岁酱吖の 提交于 2020-01-08 11:50:46
递归与分治策略 递归与分治策略是五大常见算法策略之一,分治策略的思想就是 分而治之 ,即先将一个规模较大的大问题分解成若干个规模较小的小问题,再对这些小问题进行解决,得到的解,在将其组合起来得到最终的解。而分治与递归很多情况下都是一起结合使用的,能发挥出奇效(1+1>2),这篇文章我们将先从递归说起,再逐渐向分治过渡,主要讲解方式是通过9个例题来说明问题的,问题都是根据难度由简到难,由浅入深,对递归与分治能有个大概的了解雏形,当然最重要还是要做大量练习才能掌握。 0、递归    0.0、Fibonacci数列(易)    0.1、阶乘(易)    0.2、小青蛙跳台阶(易)    0.3、全排列问题(偏难)    0.4、整数划分(偏难) 1、分治策略    1.0、归并排序(一般)    1.1、二分查找(易)    1.2、棋盘覆盖(偏难)    1.3、日程表问题(偏难) 递归 我们第一次接触递归一般都是在初学C语言时候的一道题目——Fibonacci数列中看到的,可能刚开始感觉有点不可思议,函数居然可以调用自己!Amazing!但事实如此,它确实存在,而递归也为我们某些算法的设计提供很大的便利,一般来说递归函数在理解起来并不是很难,甚至可以通过数学归纳法给予证明,但一直让人诟病的一点莫过于Debug的时候了,有时候调试一个较为复杂的递归函数能把人逼疯。 我们在这里将会

Python—递归函数

久未见 提交于 2020-01-07 20:52:43
斐波拉切数列 阶乘 可使用递归函数 链接: https://www.cnblogs.com/tianyiliang/p/7775071.html 1.递归函数在函数内部调用函数本身 2.递归函数本质是一个方法的循环调用,注意有可能出现死循环 3.一定要定义递归的边界,一定要定义什么时候退出循环 阶乘 n= 1*2*3*4*5.....*n def test(n): if n==1: return 1 retun n *test(n-1) print(test(5)) 来源: https://www.cnblogs.com/yescarf/p/12163502.html

算法导论笔记(一):复杂度,分治,随机

做~自己de王妃 提交于 2020-01-07 18:59:15
示例与概念 插入排序 归并排序 最坏情况分析与平均情况分析 函数增长的渐进记号 (O(n)) 表示函数增长的上界。即,花费时间不会高于线性增长。 (Theta(n)) 同时表示上界和下界。即,花费时间一定是这个线性增长的。 (Omega(n)) 表示增长的下界。 (o(n)) 表示不渐进紧确的上界。如, (2n =O(n^2)) , (n^2=O(n^2)) , (2n=O(n^2)) ,但 (n^2neq o(n^2)) (omega(n)) 与 (o(n)) 类似,表示不紧确的下界。 此外,常用 (T(n)) 表示所需的实际时间的函数。 分析分治算法,以归并排序为例 归并排序最坏运行时间的递归式: [ T(n)=begin{cases}Theta(1)&text{若} n=1,\ 2T(n/2)+Theta(n)&text{若} n>1. end{cases} ] 除使用主定理外,还可以这样理解递归式的值:将递归过程看做一个二叉树。递归调用中的每一层的总代价均为 (cn) ,其中 (c) 为常数。而二叉树的层数应为 (log_2n+1) 。故,整个算法的代价期望为 (Theta(nlog_2n)) 。 分治法 分治法求最大和的子数组 分解。将数组划分为两个子数组。此时,只存在三种子数组: 全部位于中点左侧的子数组 全部位于中点右侧的子数组 跨越中点的子数组 解决

递归自举其它

£可爱£侵袭症+ 提交于 2020-01-07 17:49:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 程序员大概都知道什么是递归吧。 在程序里,递归指一个程序直接或者间接的调用它自己。 自举,看字面的意思,自己把自己举起来。 在程序里常看到的是编译器的自举,操作系统启动的自举。 新版本的编译器是由老版本的编译器编译生成的。 操作系统在计算机加电的时候通过 bootloader 把自己加载进内存进而执行自己。 就像一个人提着自己的头发把自己提起来。 虽然在现实世界是不可能,但是在虚拟世界,却是如此的有趣。 递归 有很多有意思的地方,在程序里,明明同样的代码,在不同的时间执行的数据却有不同。 以下开始记流水账了。 MIT 计算机科学系的系徽 就是一个 lambda 递归的格式。 lambda 算子,Y 组合子,这些计算机科学相关的东西先不展开了。 installsheild 是用 installsheild 安装的。 哪里不对?好像是先有鸡,还有先有蛋的感觉。 第一版本的 installsheild 如何来的呢? 不负责任的猜一下。 installsheild 一开始一定是其它语言写成的。 这是自举的一个前提,借助第三方的程序来实现第一版的自己。 第三方程序一般叫做桩程序,或者脚手架,bootloader, bootstrap 这类。 至于具体叫什么,看个人喜好。 总之,就是有这么个第三方的程序。 比如,先用 C+

复杂度分析之空间复杂度

自古美人都是妖i 提交于 2020-01-07 17:46:36
几种空间复杂度 1. 常量空间 当算法的存储空间大小固定,和输入规模没有直接的关系时,空间 复杂度记作O(1)。例如下面这段程序: void fun1(int n){ int var = 3; … } 2. 线性空间 当算法分配的空间是一个线性的集合(如数组),并且集合大小和 输入规模n成正比时,空间复杂度记作O(n)。 例如下面这段程序: void fun2(int n){ int[] array = new int[n]; … } 3. 二维空间 当算法分配的空间是一个二维数组集合,并且集合的长度和宽度都 与输入规模n成正比时,空间复杂度记作O(n2)。 例如下面这段程序: void fun3(int n){ int[][] matrix = new int[n][n]; … } 4. 递归空间 递归是一个比较特殊的场景。虽然递归代码中并没有显式地声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储“方法调用栈”。“方法调用栈”包括进栈和出栈两个行为。当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中。当方法返回时,执行出栈操作,把调用的方法和参数信息从栈中弹出。 下面这段程序是一个标准的递归程序: void fun4(int n){ if(n<=1){ return; } fun4(n-1); … } 假如初始传入参数值n=5,那么方法fun4