递归调用

递归介绍

怎甘沉沦 提交于 2019-11-28 14:52:22
  在C++语言中, 递归调用(recursive call)就是某一方法调用自身 。这种自我调用通常是直接的,即在函数体中包含一条或多条调用自身的语句。递归也可能以间接的形式出现,即某个方法首先调用其它方法,再辗转通过其它方法的相互调用,最终调用起始的方法自身。   递归的价值在于,许多应用问题都可简洁而准确地描述为递归形式。以操作系统为例,多数文件系统的目录结构都是递归定义的。具体地,每个文件系统都有一个最顶层的目录,其中可以包含若干文件和下一层的子目录;而在每一子目录中,也同样可能包含若干文件和再下一层的子目录;如此递推,直至不含任何下层的子目录。通过如此的递归定义,文件系统中的目录就可以根据实际应用的需要嵌套任意多层(只要系统的存储资源足以支持)。   以下将从递归的基本模式入手,循序渐进地介绍如何选择和应用( 线性递归、二分递归和多分支递归等 )不同的递归形式,以实现( 遍历、分治等 )算法策略,以及如何利用 递归跟踪和递推方程等方法分析递归算法的复杂度 。    一、线性递归   数组求和问题: 1 sum(int A[],int n) //传入的参数是数组长度 2 { 3 if (n < 1) //平凡情况:递归基 4 return 0; //直接计算(非递归式) 5 else //一般情况 6 return sum(A,n - 1) + A[n-1] ; //递归

第三章笔记:归纳,递归及化简

守給你的承諾、 提交于 2019-11-28 13:42:17
摘要:1. 介绍 2.基于归纳法与递归法的设计 3. 更强的假设条件 4.不变式与正确性 5. 松弛法与逐步完善 6. 归简法 + 换位法 = 困难度证明 7. 一些解决问题的建议 本章专注于讨论算法设计的基础技能。本章主题思想 归纳(induction)递归(recursion)及归简(reduction),通常会忽略掉问题的大部分内容,并将讨论聚焦于其解决方案中的某个单一步骤。而最妙的事情在于,该步骤恰是我们所需要的全部,有了它,其余问题迎刃而解。这些解决方案是由密切联系的。某种意义上,归纳法和递归法之间互为镜像,而两者都可以视为归简法的具体示例。 归简法指的是将某一问题转化成另一个问题。我们通常都会倾向于将一个未知问题归简成一个已解决的问题。归简法可能会涉及输入(操作中可能会遇到的新问题)与输出(已经解决的原问题)之间的转化。 归纳法(或者说数学归纳法)则被用于证明某个语句对于某种大型对象类(通常是一些自然数类型)是否成立。我们首先要证明语句在某一基本情况下(例如当数字为1时)是成立的,然后证明它可以由一个对象“推广到”下一个对象(如果其对于n-1成立,那么它对于n也成立)。 递归法则主要被用于函数自我调用时。在这里,我们需要确保函数在遇到基本情况时的操作是正确的,并且能将各层递归调用的结果组合成一个有效的解决方案。 其中,归纳法与递归法都倾向于将问题归简(或分解

python 递归查找jpg文件并打印

痞子三分冷 提交于 2019-11-28 12:39:31
文件递归 查找出以('jpg', 'gif', 'png','JPG', 'GIF', 'PNG') 结尾的文件并打印 遇到的bug: 好几个文件夹下面的照片都是以大写格式的JPG 显示的,当时只考虑到小写, 导致其他文件以.JPG结尾的文件都打印不出来。。。导致问题定位了很久 遗留:压缩包的文件(rar 或zip )暂未处理   思路:文件解压 pip3 install rarfile 得将unrar.exe放在当前脚本的同一目录下 import os #import rarfile def get_picture(filepath, layer): #遍历filepath下所有文件,包括子目录 prefix = joinStr('-', layer) layer += 1 if os.path.isdir(filepath): print(prefix, ' 文件夹 ', filepath, " size=", os.path.getsize(filepath)) else: print(prefix, ' 文件 ', filepath, " size=", os.path.getsize(filepath)) return files = os.listdir(filepath) for fi in files: #文件路径 fi_d = os.path.join

DFS-递归入门

我只是一个虾纸丫 提交于 2019-11-28 12:39:26
【递归入门】 题目描述 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n)。 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。 例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:     3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。   现在,要求你计算出和为素数共有多少种。 例如上例,只有一种的和为素数:3+7+19=29。 输入 第一行两个整数:n , k (1<=n<=20,k<n) 第二行n个整数:x1,x2,…,xn (1<=xi<=5000000) 输出 一个整数(满足条件的方案数)。 样例输入 4 3 3 7 12 19 样例输出 1 代码 #include <iostream> #include <cstring> #include <vector> using namespace std; //判断是否是素数 bool isprime(int n) { if (n<1)return false; for (int i=2;i*i<n;i++) { if (n%i==0)//n&(i-1)==0 return false; } return true; } int a[22],p[22], b[22]; bool vis[22]; int n, k,

MySql递归查询实现父子查询

怎甘沉沦 提交于 2019-11-28 10:14:44
父子查询 根据父id查询下面所有子节点数据。 功能需求 我们这里以sec_org(部门表)为例,在一个部门表里面包含org_id(子部门id)、parent_org_id(父部门id)、org_name(子部门名称)等字段,我们要实现通过传入一个部门id,查询出它下面的所有子部门记录的功能。 具体实现 我们可以通过Mysql函数的递归调用来实现。 1.创建函数getChildrenOrg。 CREATE DEFINER=`root`@`%` FUNCTION `getChildrenOrg`(parentId VARCHAR(36)) RETURNS varchar(4000) CHARSET utf8 BEGIN DECLARE oTemp VARCHAR(4000); DECLARE oTempChild VARCHAR(4000); SET oTemp = ''; SET oTempChild = parentId; WHILE oTempChild IS NOT NULL DO SET oTemp = CONCAT(oTemp,',',oTempChild); SELECT GROUP_CONCAT(org_id) INTO oTempChild FROM sec_org WHERE FIND_IN_SET(parent_org_id,oTempChild) > 0;

day15

眉间皱痕 提交于 2019-11-28 09:50:01
函数递归 递归,递是递进的意思,归是归来的意思 递归就是用函数在调用一个函数的过程中,又直接或间接地调用了它自身。这样函数会一层一层的递进进去,如果没有条件的话,他就会无限循环。如果有条件的话,当运行到条件中断时,它就会一层一层的回来,直到最初的函数 直接调用 直接调用指的是直接在函数内部调用函数自身 mport sys # 修改递归层数 sys.setrecursionlimit(10000) def foo(n): print('from foo',n) foo(n+1) foo(0) 这个函数会递归10000次 间接调用 间接调用指的是不在原函数体内调用函数,而是通过其他方法间接调用函数自身 def bar(): print('from bar') foo() def foo(): print('from foo') bar() bar() 这段代码会无限循环 from foo from bar 直至到达Python最大递归深度的时候,后面就会循环报错 递归核心 递归本质上还是解决问题的,并不为了让一段代码陷入死循环。所以一般在递进的时候,为了达到一个结果,使问题规模越来越小(不一定要真正达到),可以设置一个条件,能够让最后偶一次函数调用结束 所以,递归更多的是一种思想 下面就用递归来实现几个简单的功能 递归实现从0到100的打印 count = 1 # 2 # 3 def

016-递归函数

岁酱吖の 提交于 2019-11-28 07:34:17
一,什么是递归   在函数中调用自身函数 二,楔子 从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢......这个故事你们不喊停我能讲一天!我们说,生活中的例子也能被写成程序 while True: story = " 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? " print(story) def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) while True: story() 尝试:通过调用本身(递归)的方式 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 先不管函数最后的报错,除了报错之外,我们能看的出来,这一段代码和上面的代码执行效果是一样的。 三,认识递归 递归的定义—— 在一个函数里再调用这个函数本身 现在我们已经大概知道刚刚讲的story函数做了什么,就是 在一个函数里再调用这个函数本身 ,这种魔性的使用函数的方式就叫做 递归 。 刚刚就已经写了一个最简单的递归函数。 递归的最大深度—

递归方法(recursion)

谁说胖子不能爱 提交于 2019-11-28 07:15:46
递归 :指在当前方法内调用自己的这种现象。 递归的分类: 递归分为两种,直接递归和间接递归。 直接递归称为方法自身调用自己。 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。 注意事项 : 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 在递归中 #### 语法案例演示一:计算1-100之间所有自然数的和 ```java public class RecursionMethod1{ public static void main(String[] args) { Count c = new Count(); int sum = c.sum(100); System.out.println("1-100的和:" + sum); } } class Count{ public int sum(int n){ if(n == 1){ return 1; }else{ return n + sum(n-1); } } } ``` 求n! public class RecursionMethod2{ public static void main(String[] args) { Count c = new Count(); int jieCheng = c.jieCheng(10); System.out.println("10的阶乘是:" +

Python11 递归函数

删除回忆录丶 提交于 2019-11-28 04:14:34
递归函数 理解:一个函数在内部调用自身本身,这个函数就是递归函数。 优点:递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 递归函数实例: 阶乘 : 代码: ``` # 阶乘 -递归函数实现 : 例3的阶乘: 1 * 1 * 2 * 3 def factorial(x): if not isinstance(x,(int)) or x < 0 : # 校验参数类型必须是正整数或者是0 raise TypeError("参数x类型必须是正整数") elif x == 0: return 1 # 0的阶乘是1 else: return x * factorial(x-1) # 分解 return x * factorial(x-1) # x = 3 时, 结果是 3 * factorial(3-1)(即x=2) # x = 2 时,结果是 2 * factorial(2-1) (即x=1) # x = 1 时,结果是 1 * factorial(1-1) (即x=3) # x = 0 时,结果是 1 # 最后结果 3 * 2 * 1 * 1 print(factorial(3)) ``` 运行结果: 栈溢出:在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回

python中对递归函数的认识

我们两清 提交于 2019-11-28 03:37:54
1 ,递归的定义 递归(Recursion Algorithm,递归算法) 是指通过 重复将问题分解为同类的子问题 而解决问题的办法。计算理论证明递归的作用可以完全取代循环。 重复 :凡是通过循环语句可实现的,都可以通过递归来实现。 将问题分解为同类的子问题: 如持续循环的运算操作、持续循环的判断操作,它们的每次循环都是同样的一个“动作”,这个“动作”就是一个子问题的。 利用函数实现递归算法的过程就是递归函数。是通过自己调用自己来实现递归算法。 2,递归函数在内存中的运行原理 递归一次,就在内存中开辟一个新的地址空间,记录递归过程状态,一直递归分解到最小范围,最后得出要么找到对应的值,要么返回找不到的结果。 通俗的讲,其实是在调用栈的进栈、出栈操作过程。每递归调用自己一次,就进栈一次,并在栈列表里记录调用的内容;每返回一次,就是出栈弹出值的过程,并把值返回到上一个栈列表里,最后返回所求最终答案。 3,举例 1 #定义函数 2 def recursion_sum(num): 3 if num==1: 4 return num 5 tt=recursion_sum(num-1)+num 6 print('第%d次递归'%(num)) 7 print('返回值%d在内存中的地址:%d'%(tt,id(tt))) 8 return num 9 #调用函数 10 print