递归调用

函数进阶之迭代器,递归

匿名 (未验证) 提交于 2019-12-03 00:03:02
可迭代的对象:具有iter方法的对象,可迭代对象不一定是迭代器对象 迭代器对象:具有iter和next方法的对象,迭代器对象一定是可迭代对象,迭代器对象加上iter方法还是迭代器本身 for 循环原理 for i in lt: 把lt变成迭代器对象 然后迭代使用next方法获取每一个元素 捕捉异常中断while循环 print(1) if i > 10 else print(2) {k:v for k,v in dic.items()} (i for i in rang(10)) #不去使用next取值,是没有值的 自定制的迭代器 def func(): yield: 1.展厅函数,遇到下一个yield继续运行函数代码 2.具有返回值 3.让函数()变成生成器对象 return: 1.终止函数 2.返回值 没有名字的函数 lambda参数:代码块 一般不单独使用,与max/min/map/filter/sorted联用 函数调用函数本身,但是必须得有结束条件 内置函数的直接用的,属于Python解释器的 数据类型的内置函数只有数据类型本身才能使用 enumerate() 流水线 优点:思路清晰 缺点:可扩展性差;功能与功能直接不独立;调试麻烦 来源:博客园 作者: 十七zz 链接:https://www.cnblogs.com/shiqizz/p/11515030.html

数据结构与算法之递归和循环

匿名 (未验证) 提交于 2019-12-02 23:57:01
递归:代码简洁,但是效率低(每次函数调用都有时间和空间的开销); 循环:和递归相反; 1 斐波那契数列 题目:写入一个函数,输入n,求斐波那契(Fibonacci)数列的第n项,斐波那契数列的定义:f(n) = f(n-1) + f(n-2),初始值f(0)=0且f(1)=1; 解题思路: (1)递归:根据f(n)的定义来递归计算; (2)循环:定义三个长整数one、Two和Res,迭代计算; 未完待续~ 来源:博客园 作者: 博1990 链接:https://www.cnblogs.com/bo1990/p/11449220.html

递归函数的调用

匿名 (未验证) 提交于 2019-12-02 23:57:01
1、递归的定义   递归指的是在一个函数中,再一次调用自己; 2、递归的实现 (1)边界条件 (2)递归前进 ―― 继续调用自己 (3)递归返回 ―― 向上返回数据 3、实例 (1)计算数字5的阶乘    分析:5!=5*4*3*2*1 => 5!=5*4! => 4!=4*3! => 3!=3*2! => 2!=2*1! => 1!=1     /*计算n的阶乘*/ function f(n){ ...... }    1 <script> 2 /* 3 *计算数字n的阶乘 4 *边界条件:n为1时,返回1 5 *递归前进:当n大于1的时候,继续调用函数:n*f(n-1) 6 *递归返回:将n*f(n-1)返回即可 7 */ 8 function f(n){ 9 //判断是否到达边界条件,如果到达,则返回1 10 if(n==1){ 11 return 1; 12 }else{ 13 return n*f(n-1); 14 } 15 } 来源:博客园 作者: 披发长歌览大荒 链接:https://www.cnblogs.com/somethingnew/p/11446757.html

汉诺塔问题(分治递归思想)

匿名 (未验证) 提交于 2019-12-02 23:56:01
汉诺塔的基本思想就是 1.先把上面n-1个通过c转移到b(因为我的c里面要放n,也就是最大的那个) 2.把a中的 n(最大的那个)移动到c 3.再把b中的n-1个通过a移动到c; 整个过程就结束了,然后递归调用这个函数,每一层递归都执行这三个步骤 最后n=1的时候,想象一下,n=1的时候,是不是把c中的1直接移到c中即可,所以这就是终止条件。今天可算是理解了汉诺塔的原理了!!!` `` #include using namespace std; void movef(int n,char a,char b){ cout<<“把”<<n<<“从”<<a<<“移动到”<<b<<endl; } void haniod(int n,char a,char b,char c){ if(n==1){ movef(n,a,c); }else{ haniod(n-1,a,c,b); movef(n,a,c); haniod(n-1,b,a,c); } } int main(){ int n; cin>>n; haniod(n,‘a’,‘b’,‘c’); } 来源:51CTO 作者: 北派胖子 链接:https://blog.csdn.net/qq_43568790/article/details/100147676

递归和循环的区别以及使用的场景

匿名 (未验证) 提交于 2019-12-02 23:52:01
递归:函数自己调用自己。 循环:设置初始值和终止条件,在一个范围内重复运算。 递归的代码简洁性更高,但是会占用更多的内存,循环的代码可读性不如递归,但是效率会高一点。 应用场景:递归用于树状结构的查询,查询地区,菜单,对象的深复制。遍历的时候,需要多次进行同样的运算用循环。

递归与分治

匿名 (未验证) 提交于 2019-12-02 23:52:01
递归 :思路简单但效率低(建立函数的副本,消耗大量时间和内存)。能用迭代就不用递归。 递推公式+递推终止条件 Fibonacci数列 # 递归 class Solution: def fib(self, N: int) -> int: if N <= 1: return N return self.fib(N-1) + self.fib(N-2) # 迭代 class Solution: def fib(self, N: int) -> int: if N <= 1: return N tmp1 = 0 tmp2 = 1 for i in range(2, N+1): res = tmp1 + tmp2 tmp1 = tmp2 tmp2 = res return res 函数调用自身,注意递归的停止条件。分为调用和回溯两个阶段。 任意长度的字符串反向,递归实现 # 需要额外存储空间 def reverseStr(string): if string == None or len(string) == 0: return None if len(string) == 1: return string return reverseStr(string[1:])+string[0] #leetcode,O(1)额外空间,原地修改。双指针 class Solution: def

COMP9021--7.18

匿名 (未验证) 提交于 2019-12-02 23:49:02
从今天开始引入递归的概念 1. 为了避免递归过程中陷入死循环,一定要在最开始的时候就写好递归结束的条件 2. 递归的本质是通过解决smaller input,并用其结果得到下一步的output,类推直至约定的递归终止点 3. yield的作用是把一个函数变成一个generator,它与函数的不同之处在于生成generator看起来像是函数调用,但不会执行任何函数操作,直到调用next。在for循环执行时,每次循环执行到yield时,语句就会中断,函数就会返回一个迭代值,下次迭代时,代码将从yield的下一条语句继续执行,直到再次碰见yield 4. iter()也是为了生成迭代器 (used in list, tuple...) 5. 补充一个上节课的知识点,序列解包: a=[0,1,2,3,4] >>>d(*a) 0 1 2 3 6. 需要注意的一点,就是默认初值指的是默认一个原始位置,但是随着语句的执行,如果多次调用默认初值,其结果也会随之变化,如图: 7. 6中的解决方案是将默认初始值设置为空,每次遇到为空的情况就建立一个新的list: 8. quiz就是要找1组成的最大长方形

递归的定义和优缺点

匿名 (未验证) 提交于 2019-12-02 23:49:02
递归的定义和优缺点 递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。 递归算法解决问题的特点: (1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 (3) 递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算法设计程序。 (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

汇编程序 - 2 (递归调用程序 -- 阶乘)

匿名 (未验证) 提交于 2019-12-02 23:48:02
这个也是学校的课设,处理的是 0--9 的阶乘。 设计思路: 总体设计思路和32位无符号数类似,结果存放在内存中;最主要的特点就是递归调用程序,即程序调用自己程序,最后通过比较一个界值来实现跳转。本设计的是0-9内的阶乘算法,有一个设计技巧:已知8!=40320(9D80H),9!=362880(58980H),由于进行乘法的16位运算MUL时,默认使用AX寄存器的值,乘积的结果放在DX:AX中。通过观察9!的16进制值知,在DX:AX中能放下。使用BX作为乘数源,从1往上递增。即当输入数据为9时,BX从1直到9完成递归调用。因为到8!时,AX中为9D80H,能够存放下,此时BX为9,运算后恰好能将值送到DX:AX中。如果从9递减到1的话,当BX为3时,运算结果(9X8X7X6X5X4X3=181440)对应16进制为2C4C0H,此时单用AX进行运算就会造成失真,如果要运算,需要先算DX的,再算AX的,没有必要。 输入:输入为0-9的字符。 运算(FAC):内部使用16进制进行运算。 调整(ADJUST):由于输出为10进制的运算后的数据,所以需要进行调整。内部实现是除10取余数,然后再入栈;除到最后时出栈,送到内存中去(只是为了内存首地址存储的是最高位,且按顺序存储)。 输出(OUTPUT):从内存中取出数据,调用21H的02H功能号,进行输出。 代码: //fac.asm

函数递归

匿名 (未验证) 提交于 2019-12-02 23:47:01
函数递归 1.递归概念 # 函数在调用阶段直接或间接的又调用自身 1. 直接调用本身 def func ( n ): print ( 'from func' , n ) func ( n + 1 ) func ( 1 ) 2. 间接调用本身 def index (): print ( 'from index' ) login () def login (): print ( 'from login' ) index () login () 2.递归模块 import sys sys . getrecursionlimit () # 查看递归的最大深度,显示1000,不是很精确,函数递归默认最大997、998 sys . setrecursionlimit ( 2000 ) #修改默认递归最大深度,传递数字必须大于最大值,但是没什么意思,函数不应该无限制的递归下去 3.递归的两个阶段 1. 回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降,直到有一个最终的结束条件 2. 递推:一次次往回推导的过程 #例题: age(5)比age(4)大2,直到age(1)=18,求age(5) def age ( n ): if n == 1 : # 递归必须要有结束条件 return 18 return age ( n - 1 ) + 2 #每一个函数都有返回值