迭代计算

递归与迭代

只愿长相守 提交于 2019-11-27 02:05:35
( 递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公项的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。) 递归(调用本身)与迭代(新值换旧值)都是基于控制结构:迭代用重复结构,而递归用选择结构。递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。迭代和递归过程都可以无限进行:如果循环条件测试永远不变成false,则迭代发生无限循环;如果递归永远无法回推到基本情况,则发生无穷递归。 递归有许多缺点,它重复调用机制,因此重复函数调用的开销很大,将占用很长的处理器时间和大量的内存空间。每次递归调用都要生成函数的另一个副本(实际上只是函数变量的另一个副本).从而消耗大量内存空间。迭代通常发生在函数内,因此没有重复调用函数和多余内存赋值的开销。那么,为什么选择递归呢? --------------------------------------------------------------------------- 摘要:在算法的分析与设计中

递归与迭代

自闭症网瘾萝莉.ら 提交于 2019-11-27 02:04:57
关于c语言部分函数的一些总结和注意事项: 递归是一种强有力的技巧,但是和其他技巧一样,它也可能被误用。这里就有一个例子。阶乘的定义往往就是以递归的形式描述的。factorial(n)=1,n<=0; factorial(n)=n*factorial(n-1),n>0; 这个定义同时具备了递归所需要的两个特性:1、存在限制条件,当符合这个条件时递归便不再继续;2、每次递归调用之后越来越接近这个限制条件。用这种方式定义阶乘往往引导人们使用递归来实现阶乘函数。程序如下所示: 1 //用递归方法计算n的阶乘 2 3 long factorial(int n) 4 5 { 6 7 if(n<=0) 8 9 return 1;10 11 else12 13 return n*factorial(n-1);14 15 } 但它不是递归的良好用法。为什么呢?因为递归函数调用将涉及一些运行时开销——参数必须压到堆栈中,为局部变量分配内存空间(所有递归均如此,并非特指这个例子),寄存器的值必须保存等。当递归函数的每次调用返回时,上述这些操作必须还原,恢复成原来的样子。所以,基于这些开销,对于这个程序而言,它并没有简化问题的解决方案。下面这个函数是尾部递归的一个例子,由于函数在递归调用返回后不再执行任何任务,所以尾部递归可以很方便的转换成一个简单循环,完成相同的任务 ,程序效率更为有效。 1 /

递归、尾递归与迭代

橙三吉。 提交于 2019-11-27 02:04:39
很久以前写过一篇《递归与迭代》,写得不是很好。可能是我自己也没把思路理清楚,现在就有了个重新整理思路炒冷饭的机会,也算是一个新的开始吧。 首先解释一个术语叫“尾调用”。直接从wiki的“ 尾调用 ”条目抄:尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下称该调用位置为尾位置。若这个函数在尾位置调用本身(或是一个尾调用本身的其他函数等等),则称这种情况为尾递归,是递归的一种特殊情形。 比如,下面这个是尾调用: return f(); 而这个不是: return 1 + f(); 关于尾调用,有个重要的优化叫做尾调用消除。经过尾调用消除优化后的程序在执行尾调用时不会导致调用栈的增长。其实,这个优化可能不算是优化。因为在某些计算模型中,尾调用天然不会导致调用栈的增长。在EOPL提到过一个原理: 导致调用栈增长的,是对参数的计算,而不是函数调用。 由于尾调用不会导致调用栈的增长,所以尾调用事实上不像函数调用,而更接近GOTO。尾递归则等同于迭代,只是写法上的不同罢了。 下面以计算幂为例,分别用递归、尾递归和迭代三种方法实现程序。其中尾递归方法是递归方法的改进,而迭代方法纯粹是从尾递归方法翻译而来。 问题 已知数(整数,或浮点数,这里假设是整数)\(b\) 和非负整数\(n\) ,求\(b\)的\(n\)次幂\(b^n\)。

Python 内置(builtins)的高阶函数 map,filter,sorted

淺唱寂寞╮ 提交于 2019-11-27 00:51:40
map函数: map(func , *iterables) 用函数对可迭代对象中的每一个元素作为参数计算出新的迭代对象,当最短的一个可迭代对象不在提供数据时,此可迭代对象生成结束。 第一个参数一定是函数,后面是均是迭代对象,返回可迭代对象。 实例: # 生成一个可迭代对象,要求此可迭代对象可以生成1—9自然数的平方。 # 1,4,9,16…81 def power2(x) return x**2 fox x in map (power2,range(1,10)): print (x) # 求以上数据的和 print(sum(map(power,range(1,10)))) pow()函数 实例: 生成一个可迭代对象,要求此可迭代对象生成 # 1**4,2**3,3**2,4**1 for x in map(pow,[1,2,3,4],[4,3,2,1]) print(x) filter函数 格式:filter(func,iterable) 作用: 筛选可迭代对象iterable中的数据,返回一个可迭代对象,此可迭代对象将对iterable进行筛选 函数func将对iterable中的每个元素进行求值,返回False时将此数据丢弃,返回True,则保留此数据 实例: 1 #isodd函数判断x是否为奇数,奇数返回True 2 def isodd(x) 3 return x % 2 =

3-22函数进阶——迭代器

心不动则不痛 提交于 2019-11-26 23:35:24
概述    迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 延迟计算或惰性求值 (Lazy evaluation)   迭代器不要求你事先准备好整个迭代过程中所有的元素。仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。 可迭代对象   迭代器提供了一个统一的访问集合的接口。只要是实现了__iter__()或__getitem__()方法的对象,就可以使用迭代器进行访问。   序列:字符串、列表、元组   非序列:字典、文件   自定义类:用户自定义的类实现了__iter__()或__getitem__()方法的对象 创建迭代器对象   使用内建的工厂函数iter(iterable)可以获取迭代器对象:   语法:     iter(collection) -> iterator     iter(callable,sentinel) -> iterator   说明:     Get an iterator from an object.     In the first form, the argument must supply its own iterator, or be a sequence.     In

迭代器与生成器

梦想与她 提交于 2019-11-26 23:25:29
一、迭代器 1、什么是迭代器协议 1、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stopiteration异常,以终止迭代。(只能往后走不能往前退) 2、可迭代对象:实现了迭代器协议的对象。(如何实现:对象内部定义了一个__iter__()方法) 3、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。 2、迭代器与可迭代对象 1、迭代器:可以被 next() 函数调用并不断返回下一个值的对象称为迭代器。 2、可迭代对象:可以直接作用于 for 循环的对象。 3、for循环 for循环的本质:循环所有的对象,全部都是使用迭代器协议。 for循环的实现: L = [1,2,3,4,5] L = L.__iter__() #使用内部方法__iter__()将其变为可迭代对象 print(L.__next__()) #使用可迭代对象提供的方法__next__()循环取值 print(L.__next__()) print(L.__next__()) print(L.__next__()) print(L.__next__()) View Code 可迭代对象会抛出 StopIteration ,为了解决这一问题,加入异常处理,模拟真实的for循环机制 L

生成器、BIF

狂风中的少年 提交于 2019-11-26 21:39:54
列表解析式 列表解析式是一种利用 [ 表达式 + for 循环 [ + if判断 ] ] 快速生成列表对象的python语法,方便使用者快速构建列表。 语法 : # 列表解析式 第一种效率会明显高于第二种 [(i,j) for i in range(1000) if i > 700 for j in range(1000) if j > 900] [{i,j} for i in range(1000) for j in range(1000) if j>900 if i > 700] 集合解析式 # 注:其中的元素必须可哈希,不允许是列表,字典,set()等不可哈希对象,否则将会报错 { (i,j) for i in range(1000) if i > 700 for j in range(1000) if j > 900 } 生成器表达式 it = (i for i in range(10)) #将会返回一个生成器对象 生成器对象 一个可以做指定操作,并在每次next()时返回一个值的对象,节省空间存放数据,但每次计算需要等待. 迭代器对象 一个可以被迭代的对象,for 将会全部迭代其中的元素,也可使用next()一个个取值返回,迭代器只可以使用一轮,无法反复使用,生成器也是一个迭代器 可迭代对象 可以被迭代的对象,例如元组,字典,集合,列表等容器,生成器和迭代器也是可迭代对象

迭代器和生成器

空扰寡人 提交于 2019-11-26 20:31:02
楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式? 首先,我可以通过索引取值l[0],其次我们是不是还可以用for循环来取值呀? 你有没有仔细思考过,用索引取值和for循环取值是有着微妙区别的。 如果用索引取值,你可以取到任意位置的值,前提是你要知道这个值在什么位置。 如果用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值。 但你有没有想过,我们为什么可以使用for循环来取值? for循环内部是怎么工作的呢? 迭代器 python中的for循环 要了解for循环是怎么回事儿,咱们还是要从代码的角度出发。 首先,我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的,但是我们换一种情况,来循环一个数字1234试试 for i in 1234 print(i) 结果: Traceback (most recent call last): File "test.py", line 4, in <module> for i in 1234: TypeError: 'int' object is not iterable 看,报错了!报了什么错呢?“TypeError: 'int' object

Python学习笔记---第二周

馋奶兔 提交于 2019-11-26 20:30:53
1.整型 符号:int 用处:用于计算和比较 python3:全部都是整型 python2:整型,长整型long 123--十进制 转二进制方法:十进制数除2,取余数从下往上排;print(bin(十进制数)) 10101--二进制 转十进制方法:1 * 2 ** 0+0 * 2 ** 1+1 * 2 ** 2+0 * 2 ** 3+1 * 2 **4 print(int("二进制数",2)) 2.布尔值 整型转布尔值==print(bool(数字)) ,整型中只要非零就是True 布尔值转整型==print(int(True/False)), 布尔值True=1,False=0 字符串转布尔值==print(bool(" ")), 字符串中只要没有内容就是False 布尔值转字符串==print(str(True/False)) 3.字符串 python中只要是引号引起来的就是字符串 作用:用于存储少量数据 字符串中每一个字母或字符都称为元素 3.1 索引(下标) 符号:a[索引位置] -- 索引位置不能超出索引最大值 从左往右排,从0开始排;从右往左排,从-1开始排 3.2 切片 返回结果是原数据本身 print(a[起始位置:终止位置])-- 顾头不顾尾(包括起始位置,不包括终止位置) 索引位置可以超过索引值,索引位置不写时默认起始位置为第一位,终止位置为最后一位 3.3

三十分钟学习STL【转载】

≯℡__Kan透↙ 提交于 2019-11-26 18:36:52
原文: http://net.pku.edu.cn/~yhf/UsingSTL.htm 太长30分钟是看不完的,不过花一个小时把他看完能对STL有个大致的了解,g++下需要加iterator头文件 以下为原文 这是本小人书。原名是《using stl》,不知道是谁写的。不过我倒觉得很有趣,所以化了两个晚上把它翻译出来。我没有对翻译出来的内容校验过。如果你没法在三十分钟内觉得有所收获,那么赶紧扔了它。文中我省略了很多东西。心疼那,浪费我两个晚上。 译者:kary contact:karymay@163.net STL概述 STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。 要点 STL算法作为模板函数提供。为了和其他组件相区别,在本书中STL算法以后接一对圆括弧的方式表示,例如sort()。 STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效。 提示