递归调用

函数进阶-递归

守給你的承諾、 提交于 2019-11-27 19:45:45
一丶什么是函数递归 函数的嵌套调用是:函数嵌套函数。函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身。 def foo(): print('from foo') foo() foo() # 进入死循环 如果递归函数不断地调用函数自身,那么这个递归函数将会进入一个死循环,因此我们应该给递归函数一个明确的结束条件。 1.1 直接调用 直接调用指的是:直接在函数内部调用函数自身。 import sys print(f"最大递归层数: {sys.getrecursionlimit()}") 最大递归层数: 3000 import sys # 修改递归层数 sys.setrecursionlimit(10000) def foo(n): print('from foo',n) foo(n+1) foo(0) 1.2 间接调用 间接调用指的是:不在原函数体内调用函数自身,而是通过其他的方法间接调用函数自身。 def bar(): print('from bar') foo() def foo(): print('from foo') bar() bar() 递归必须要有两个明确的阶段:  * 递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小  * 回溯:递归必须要有一个明确的结束条件,在满足该条件开始一层一层回溯。

类型和程序设计语言

我的梦境 提交于 2019-11-27 19:10:20
编程语言的类型系统为何如此重要? - 知乎 https://www.zhihu.com/question/23434097/answer/43057230 《类型和程序设计语言》.pdf - 免费高速下载 - 皮皮盘-收入最高的网盘 当前标签:简单易懂的程序语言入门小册子 当前标签:简单易懂的程序语言入门小册子 简单易懂的程序语言入门小册子(9):环境,引入环境 古霜卡比 2014-05-16 05:46 阅读:793 评论:2 简单易懂的程序语言入门小册子(8):基于文本替换的解释器,小结 古霜卡比 2014-05-08 08:55 阅读:883 评论:5 简单易懂的程序语言入门小册子(7):基于文本替换的解释器,加入continuation,重构解释器 古霜卡比 2014-05-03 10:27 阅读:643 评论:0 简单易懂的程序语言入门小册子(1.5):基于文本替换的解释器,递归定义与lambda演算的一些额外说明 古霜卡比 2014-05-02 11:41 阅读:753 评论:0 简单易懂的程序语言入门小册子(6):基于文本替换的解释器,引入continuation 古霜卡比 2014-04-28 11:18 阅读:926 评论:2 简单易懂的程序语言入门小册子(5):基于文本替换的解释器,递归,不动点,fix表达式,letrec表达式 古霜卡比 2014-04-23

递归函数

谁说我不能喝 提交于 2019-11-27 18:38:18
递归函数是在一个函数通过名字调用自身的情况下构成的, function factorial (num){ if (num <= 1){ return 1; } else { return num* factorial(num-1) } } var anotherFactorical = factorial; console.log(anotherFactorical) factorial = null console.log(anotherFactorical(4))//出错 函数的名字是一个指向函数对象的指针,如果把函数的名字与函数对象本身的指向关系断开,就会出错 解决方法: arguments.callee(指向正在执行的函数的指针) function factorial (num){ if (num <= 1){ return 1; } else { return num* arguments.callee(num-1) } } var anotherFactorical = factorial; console.log(anotherFactorical) factorial = null console.log(anotherFactorical(4))//24 严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误

C语言程序设计(七)

我们两清 提交于 2019-11-27 18:36:28
第七章 函数 分而治之: 把较大的任务分解成若干较小、较简单的任务,并提炼出公用任务的方法 函数是C语言中模块化程序设计的最小单位,既可以把每个函数都看作一个模块,也可以将若干相关的函数合并成一个模块 信息隐藏: 把函数内部的信息对不需要这些信息的其他模块隐藏起来,让使用者不必关注函数内部是如何做的 只知道它能做什么以及如何使用它即可,从而使得整个程序的结构更加紧凑,逻辑也更清晰 标准库函数:使用ANSIC的库函数,必须在程序的开头将该函数所在的头文件包含进来 自定义函数 函数在使用之前必须定义 函数名是函数的唯一标识,用于说明函数的功能 为了便于区分,通常变量名用小写字母开头的单词组合而成,函数名则用大写字母开头的单词组合而成 Windows风格: 函数名使用“动词”或者“动词+名词”的形式 变量名使用“名词”或者“形容词+名词”的形式 函数体必须用一对花括号{}包围,这里的花括号是函数体的界定符 在函数内部定义的变量只能在函数体内访问,称为 内部变量 函数头部参数表里的变量,称为形式参数,也是内部变量 形参表是函数的入口 函数名相当于运算的规则,形参表里的形参相当于运算的操作数,函数的返回值就是运算的结果 若函数没有返回值,则需用void定义返回值的类型 若函数不需要入口参数,则用void代替函数头文件形参表中的内容 在函数定义的前面写上一段注释来描述函数的功能及其形参

递归打印盘符下面的文件夹Winform

雨燕双飞 提交于 2019-11-27 18:03:49
private void button1_Click(object sender, EventArgs e) { //Directory/Folder目录 FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); //ShowDialog对话框 if (folderBrowserDialog.ShowDialog()==DialogResult.OK) { //清除追加的效果 treeView1.Nodes.Clear(); //获取用户选定路径 string getPath=folderBrowserDialog.SelectedPath; //实例化一个树节点 TreeNode rooNode = new TreeNode(); //在获取到的都换成空 rooNode.Text = getPath.Replace(Path.GetDirectoryName(getPath)+"\\", ""); //获取文件夹下的所有内容 string[] getStrings = Directory.GetFileSystemEntries(getPath); //调用下面的方法 SearchDirectories(rooNode, getStrings); //一级显示 treeView1.Nodes.Add

左神算法第八节课:介绍递归和动态规划(汉诺塔问题;打印字符串的全部子序列含空;打印字符串的全排列,无重复排列;母牛数量;递归栈;数组的最小路径和;数组累加和问题,一定条件下最大值问题(01背包))

余生颓废 提交于 2019-11-27 16:55:36
暴力递归: 1,把问题转化为规模缩小了的同类问题的子问题 2,有明确的不需要继续进行递归的条件(base case) 3,有当得到了子问题的结果之后的决策过程 4,不记录每一个子问题的解 动态规划 1,从暴力递归中来 2,将每一个子问题的解记录下来,避免重复计算 3,把暴力递归的过程,抽象成了状态表达 4,并且存在化简状态表达,使其更加简洁的可能 一:递归 1. 汉诺塔问题 汉诺塔问题(不能大压小,只能小压大),打印n层汉诺塔从最左边移动到最右边的全部过程。 左中右另称为 from、to、help。 划分子问题: 1、先把1~n-1从from移动到help; 2、把单独的n移动到to; 3、1~n-1从help移动到to; 时间复杂度就是:T(n) = T(n-1) + 1 + T(n-1) = 2T(n-1)+1(一个等比公式)。T(n-1)是移动到help;1是从from直接移动到to;T(n-1)是把全部n-1挪回去。总的步数是2的N次方减一。 2. 打印一个字符串的全部子序列,包括空字符串 例如:一个字符串awbcdewgh 他的子串:awbc,awbcd,wbcde...很多个子串,但是都是连续在一起 他的子序列:abc,abcd,abcde...很多个子序列,但是子序列中的字符在字符串中不一定是连在一起的 所以 子串!=子序列 思路:穷举,例如“abc”

File类和递归

橙三吉。 提交于 2019-11-27 15:38:22
File 该类是“文件”和“目录路径名”的抽象表示形式 继承于Object,实现了Serializable接口和Comparable接口,即支持 序列化 和 比较大小 File能直接被存储在有序的集合中 构造File的方法: new File( File 文件路径 , String 文件名 ) new File( String 文件路径 , String 文件名) new File( String 全路径 ) 成员方法: 获取: getAbsolutePath( ) 返回绝对路径名称 getName( ) 返回文件或目录的名称 getPath( ) 返回相对路径名称 创建、删除: createNewFile( ) 创建一个新空文件 mkdir( ) 创建相对路径指定目录 delete( ) 删除相对路径文件或目录 判断: exists( ) 判断文件或目录是否存在 isDirectory( ) 判断是否是目录 isFile( ) 判断是否是文件 获取路径下的目录和文件: list( ) 返回 String[] listFiles( ) 返回 File[] 注意: 根据需要不同的方法来选择不同的返回对象 指定的必须是目录,否则会空指针异常 文件过滤器 在File类中,有重载listFiles方法 File[] listFiles(FilenameFilter filter);

JavaScript函数尾调用与尾递归

半世苍凉 提交于 2019-11-27 15:13:48
什么是函数尾调用和尾递归 函数尾调用与尾递归的应用 一、什么是函数的尾调用和尾递归 函数尾调用就是指函数的最后一步是调用另一个函数。 1 //函数尾调用示例一 2 function foo(x){ 3 return g(x); 4 } 5 //函数尾调用示例二 6 function fun(x){ 7 if(x > 0){ 8 return g(x); 9 } 10 return y(x); 11 } 调用最后一步和最后一行代码的区别,最后一步的代码并不一定会在最后一行,比如示例二。还有下面这一种不能叫做函数尾调用: 1 // 下面这种情况不叫做函数尾调用 2 function fu(x){ 3 var y = 10 * x; 4 g(y); 5 } 为什么这种情况不叫作函数的尾调用呢?原因很简单,因为函数执行的最后一步是return指令,这个指令有两个功能,第一个功能是结束当前函数执行,第二个功能是将指令后面的数据传递出去(函数返回值)。而这个return指令不管有没有声明都会执行,没有声明的情况下返回的数据是undefined,所以上面的代码实际上是以下结构: 1 function fu(x){ 2 var y = 10 * x; 3 g(y); 4 return undefined; 5 } return指令是先关闭函数,然后再返回数据。说到这里,就会引发一个问题出来

流程控制、方法

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-27 15:12:00
一、 流程控制分类 流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:分支结构、循环结构和顺序结构。 1、java 分支结构分为两种 :    ① if 条件分支 , 判断类型不是单一,只要一个分支被执行后,后边的分支不再执行,等值和区间都可以,if的使用范围大   ② switch case , 匹配 固定值(整形/字符/布尔值/字符串(jdk1.7+)不到迫不得已不要用字符串匹配);判断条件类型单一;在分支执行完后(如果没有break跳出),不加判断地执行下去; default可以 省略( default 的位置可以任意,但不在最后时,break不可省略;强烈建议放到最后,放到最后的 default 可以省略 break ) 2、 java 中常见的循环有三种 while / do while / for,循环的结构:声明变量用于控制循环次数、循环条件、循环体、迭代变化   ①while先 判断条件,后执行循环体,若第一次判断为false,循环体一次都不执行   ②do while 先执行 循环体 ,后判断条件。最少执行1次。若while循环/do while第一次判断为true, 则两种循环没有区别   ③for 表达式 1 迭代变量 初始化, 表达式 2 循环条件判断 , 若为 false ,循环结束, 表达式 3 迭代变化,执行函数体{ } 3、顺序结构

052 递归函数

前提是你 提交于 2019-11-27 13:05:58
函数递归 1.什么是函数递归 函数的嵌套调用:一个函数里面又写了一个函数。 函数的递归调用:他是一种特殊的嵌套调用,他也是在函数里面调用函数,但是他在函数体内调用的函数时他自己本身。 如果递归函数不断的在函数体内调用函数自己本身,如果我们不给终止条件来结束程序运行的话,程序就会进入死循环,那这个时候程序运行将会报错,因此我们应该给递归函数一个明确的结束条件。 def foo(): print('from foo') foo() foo() # 此时程序会进入死循环 2.直接调用 直接调用指的是:直接在函数内部调用函数自身。 1.利用传参的方式来计算n个人后的第n个人的年龄 2.用到变量作用域的知识点(global、可变数据类型、) ls = [16] def func(n): if n == 0: return ls[0] res = func(n-1)+2 return res print(func(5)) 3.间接调用 间接调用指的是:不在原函数体内调用函数自身,而是通过其他的方法间接调用函数自身。 def name(): print('hello,xichen') age(20) def age(n): print('my name is ',n) name() print(name()) print(age(20)) 4.递归需要注意 递:一层一层的递归调用