递归调用

7.11牛客题(递归)

匿名 (未验证) 提交于 2019-12-02 23:47:01
1、对递归程序的优化的一般的手段为(A) A 尾递归优化 B 循环优化 C 堆栈优化 D 停止值优化 解析: https://www.cnblogs.com/Alexander-Lee/archive/2010/07/21/1782543.html 尾递归 : 在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。 尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。 遗憾的是,大多数编程语言没有针对尾递归做优化。 以斐波那契数列为例子 普通的递归版本 int fab(int n){ if(n<3) return 1; else return fab(n-1)+fab(n-2); } 具有"线性迭代过程"特性的递归―尾递归过程 int fab(int n,int b1=1,int b2=1,int c=3){ if(n<3) return 1; else { if(n==c) return b1+b2; else return fab1(n,b2,b1+b2,c+1); } } 以fab(4)为例子 2、采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是() 递归次数与每次划分后得到的分区处理顺序无关。 解析:

3-递归调用

匿名 (未验证) 提交于 2019-12-02 23:47:01
1、函数的调用 :当在一个函数的运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事: 将所有的实际参数,返回地址等信息传递给被调函数。 为被调函数的局部变量(也包括形参)分配存储空间 将控制转移到被调函数的入口 2、从被调函数返回主调函数之前,系统也要完成三件事: 保存被调函数的返回结果 释放被调函数所占的存储空间 依照被调函数保存的返回地址将控制转移到调用函数 #### 不同函数之间的相互调用 # include <stdio.h> void f(); void g(); void k(); void f() { printf("FFFF\n"); g(); printf("1111\n"); } void g() { printf("GGGG\n"); k(); printf("2222\n"); } void k() { printf("KKKK\n"); } int main(void) { f(); return 0; } 3、当有多个函数相互调用时,按照“后调用先返回”的原则,上述函数之间信息传递和控制转移必须借助“栈”来实现,即系统将整个程序 运行时所需的数据空间安排在一个栈中,每当调用一个函数时,将在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,就进行出栈操作,当前运行的函数永远都在栈顶位置。 4

lua 用递归方式实现冒泡排序

匿名 (未验证) 提交于 2019-12-02 23:45:01
1 --冒泡原理:比较相邻元素,如果第一个比第二个大,就交换他们两个。 2 3 tb={1,-1,0,89,45,-90.1,3} 4 i=1--循环次数 5 statrIndex=1 6 function changeData(k) 7 if tb[k]<tb[k+1] then 8 tb[k],tb[k+1]=tb[k+1],tb[k] 9 end 10 end 11 --递归实现冒泡函数 12 function recursion(k) 13 if k>#tb-i then--交换完成,执行下一次循环。循环次数i增加1,交换角标k重置为1 14 i=i+1 15 k=1 16 end 17 changeData(k)--交换元素函数 18 return i>=#tb or recursion(k+1)--对递归进行控制,添加结束条件。 i<#tb and recursion(k+1)这个写法也是可以的 19 end 20 recursion(statrIndex);--调用函数 21 print(table.concat( tb, ", ", 1, #tb))--打印排序完成的table TAG:记录点点滴滴,从简单做起。欢迎指点,请多批评。

递归

混江龙づ霸主 提交于 2019-12-02 23:44:54
1. 递归的定义 在定义一个函数时出现调用本函数的过程称为递归。 1.1 以下为求 n! 的递归函数,理解一下递归 int fun(int n) { if(n == 1) return 1; else return ( fun(n - 1) * n ); } 1.2 递归的过程(举例求 5 的阶乘 fun(5) ) 递归是代码共享的,也就是用同一个函数的代码,系统会为每一次调用开辟一组储存单元来存放本次调用的返回地址和被中断的函数的参数值。 2. 递归的条件 1.必须是有结束递归的条件 2.必须是有限的调用次数 3.必须是在调用过程中数量规模递减 3. 递归的利弊 利:结构简单,便于阅读 弊:占用内存多,效率低,还可能栈溢出。 补充: CPU使用栈的方式来支持递归函数的调用操作,进入函数时为局部变量分配存储空间,退出时收回这部分空间。每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。 4. 递归的应用 4.1 汉诺塔问题 将盘片从 x 移到 z ,且小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘 void Hanoil(int n,char x,char y,char z) { if(n == 1) printf("第%d个盘片从%c移到%c",n,x,z); else { Hanoil

CLR 混合线程同步构造

China☆狼群 提交于 2019-12-02 23:41:31
CLR 混合线程同步构造 “基元线程同步构造”讨论了基元用户模式和 内核模式线程同步构造。其他所有线程同步构造都基于它们而构建,而且一般都合并了用户模式 和 内核模式构造,我们称为 混合线程同步构造 。 没有竞争时 —— 用户模式,有竞争时—— 内核模式。 下面是一个混合线程同步锁的例子: internal sealed class SimpleHybridLock: IDisposable{ // The Int32 is used by the primitive user•mode constructs (Interlocked methods) private Int32 m_waiters = 0; // The AutoResetEvent is the primitive kernel•mode construct private readonly AutoResetEvent m_waiterLock = new AutoResetEvent(false); public void Enter() { // Indicate that this thread wants the lock if (Interlocked.Increment(ref m_waiters) == 1) return; // Lock was free, no contention,

树的子结构――js

匿名 (未验证) 提交于 2019-12-02 23:35:02
树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) ˼· 二叉树子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。例如: 由于A中有一部分子树的结构和B是一样的,因此B是A的子结构。 1.有关二叉树的算法问题,一般都可以通过递归来解决。那么写成一个正确的递归程序,首先一定要分析正确递归结束的条件。 2.如果根节点相同则递归调用isSubtree(),如果根节点不相同,则判断root1的左子树和root2是否相同,再判断右子树和tree2是否相同; 3.注意null的条件,HasSubTree中,如果两棵树都不为空才进行判断,isSubtree中,如果root2为空,则说明第二棵树遍历完了,即匹配成功; 4.root1为空有两种情况:(1)如果root1为空&&root2不为空说明不匹配,(2)如果root1为空,root2为空,说明匹配。 代码 /* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ function isSubtree ( root1 , root2 ) { if ( root2 == null ) return true ; if ( root1 == null ) return

递归函数,二分运算

匿名 (未验证) 提交于 2019-12-02 23:34:01
递归函数:在函数中自身调用自己。 def story(): print('ssss') story() #递归调用 story() #调用 常报错recursionerror 这个错误是指超过内存最大深度 最大递归深度默认值是998,这个值是可以修改的 import sys 缺点:递归比较占用内存,所以如果递归次数太多就不适合用该方法来解决了 优点:能使代码变得简单‘’ def age(l): if l == 40: return 40 elif i > 0 and i < 4: return age(l+1) +2 二分查找算法:把数列一分为二通过中间值与要查找的数的比较再进行查找 #二分查找法 -利用递归 l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,88] def find(l,aim,start = 0,end = len(l)): ret = (end - start) // 2 + start if start <= end: if l[ret] < aim: return find(l,aim,start = ret+1,end = end) elif l[ret] > aim: return find(l,aim,start = start,end = ret-1)

Python基础-12

匿名 (未验证) 提交于 2019-12-02 22:54:36
day11回顾: 变量 局部变量 全局变量 globals() / locals() 用来获取全局变量和局部变量的字典 函数名是变量 def xxx(....): pass 一个函数可以作为实参传入另一个函数 def fx(fn, L): pass fx(max, [1,2,3]) 函数可以作为另一个函数的返回值 def fx(): def hello(): print("hello world") return hello fh = fx() fh() # 调用hello这个函数 python 的四个作用域: L E G B 局部 外部嵌套函数作用域 全局 内建作用域 global 语句 nonlocal 语句 day12笔记: lambda 表达式(又名匿名函数表达式) 作用: 创建一个匿名函数对象 同def类似,但不提供函数名 语法: lambda [形参1, 形参2, ...] : 表达式 示例: def myadd(x, y): return x + y 可以改写为: myadd = lambda x, y: x + y print(myadd(100, 200)) print(myadd("ABC", "100")) 语法说明: 1. lambda 只是一个表达式,它用来创建一个函数对象 2. 当lambda表达式调用时,先执行冒号后的表达式,并返回表达式的结果的引用

Python递归函数的正确理解与使用

匿名 (未验证) 提交于 2019-12-02 22:51:30
先看一个题目: 题面描述 小明很喜欢学数学,并且喜欢做一些奇怪的题,这天他想知道对于给定的 N ,有多少个 M 满足“ M<=N, gcd(N,M)==1, M 是偶数”。请你编写程序帮助小明解决这个问题。 输入数据 输入数据第一行为一个正整数 T ,表示测试数据的组数。 接下来的 T 组测试数据中, 每组测试数据为一行,包含一个整数 N (1≤T≤100, 1≤N≤10000 )。 输出数据 对于每一组输入数据,在单独的一行中输出 ”Case #id: M”, 表示第 id 组数据结果是 M , id 从 1 开始; 样例输入 4 1 2 11 23 样例输出 Case #1: 0 Case #2: 0 Case #3: 5 Case #4: 11 Hint: gcd(a,b)==1 表示 a 与 b 的最大公约数为 1 ,即 a 与 b 互素。 讲讲算法思路 分析输入输出与显示 源代码与递归函数的精华所在 1.两个数互素:最小公约数为1。我们只要把大一点的数%较小的数,上一轮较小的数%这个余数又得到一个余数,每次判断这个余数是0还是1。只要有0出现就不互素。 2.输入用list[]保存。输出的序号可以在循环里面计数。输出赋值:print('Case #%d: %d'%(x,y)) 3. #求法,可能会用到函数,递归函数等 def gcd(x,y):#定义递归函数 if x>=y

Python3:函数

匿名 (未验证) 提交于 2019-12-02 22:51:30
# 函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”: a = abs # 变量a指向abs函数 print (a(- 1 )) # 所以也可以通过a调用abs函数 # 在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。 # 我们以自定义一个求绝对值的my_abs函数为例: # 如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。return None可以简写为return。 def my_abs (x): if x >= 0 : return x else : return -x print (my_abs(- 99 )) # 如果想定义一个什么事也不做的空函数,可以用pass语句: # pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。 # pass还可以用在其他语句里 def nop (): pass # 让我们修改一下my_abs的定义,对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance()实现: def my_abs (x): if not