迭代计算

深究递归和迭代的区别、优缺点及实例对比

不想你离开。 提交于 2020-01-03 22:42:03
1.迭代是人,递归是神! 从“编程之美”的角度看,可以借用一句非常经典的话: “迭代是人,递归是神!” 来从宏观上对二者进行把握。 从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。 2.递归 递归就是函数自己调用自己。 2.1构成递归需具备的条件: 子问题须与原始问题为同样的事,且更为简单; 2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 2.2递归的基本原理 第一: 每一级的函数调用都有自己的变量。 第二: 每一次函数调用都会有一次返回。 第三: 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。 第四: 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。 第五: 虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。 2.3递归优缺点 2.4编写一个递归函数 这个递归函数的功能是什么,怎样调用这个函数,即设计好递归函数的返回值和参数列表 什么时候应该结束这个递归,它的边界条件(出口)是什么(边界条件) 在非边界情况时,怎样从第n层转变成第n+1层(递推公式) 例: int f(int n) {   //出口 if (n > 0) { return n + f(n - 1); } else { return 0; } } 解析: 具体步骤

机器学习(5)之集成学习(RF\\AdaBoost\\GBDT)

╄→гoц情女王★ 提交于 2020-01-03 12:35:23
目录 1 集成学习的思想 1.1 Bagging简介 1.2 Boosting简介 1.3 Stacking简介 2 随机森林(Random Forest) 2.1 算法流程 2.3 TRTE 2.4 Isolation Forest(IForest) 2.5 RF随机森林的优缺点 3 AdaBoost 3.1 算法原理 3.2 算法的构建过程 3.3 总结 4 GBDT 4.1 算法原理 4.2 GBDT回归算法和分类算法 4.3 总结 1 集成学习的思想 集成学习的思想是将若干个学习器(分类器&回归器)组合之后产生一个新学习器。弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测的分类器(errorrate < 0.5)。 集成算法的成功在于保证弱分类器的多样性(Diversity)。而且集成不稳定的算法也能够得到一个比较明显的性能提升。 常见的集成学习思想有:Bagging、Boosting、Stacking 1.1 Bagging简介 Bagging方法又叫做自举汇聚法(Bootstrap Aggregating), 思想 :在原始数据集上通过 有放回的抽样 的方式,重新选择出S个新数据集来分别训练S个分类器的集成技术。也就是说这些模型的训练数据中允许存在重复数据。 Bagging方法训练出来的模型在预测新样本分类的时候,会使用 多数投票或者求均值

梯度下降法实现一元线性回归

雨燕双飞 提交于 2020-01-02 23:45:57
梯度下降法实现一元线性回归 给定一个数据集,该数据集是n行2列的数据。当用记事本打开数据时,每行的2列数据是用逗号隔开的。首先要提取文件里面的数据,之后根据提取的数据进行画图。 数据集见链接:https://pan.baidu.com/s/1Bhn47ynrNaPO_eG191VuUw 提取码:qweu 代码如下: # 用于计算数据要用到的包numpy import numpy as np # 画图要用到的包matplotlib import matplotlib . pyplot as plt # 载入数据要用到numpy(由于项目和文件在同一个目录下,所以 # 可以直接填写文件的名字就能加载文件,如果不是在同一个目录 # 下,需要填写绝对路径;文件文件分隔符是“,”) data = np . genfromtxt ( "data.csv" , delimiter = "," ) # “ :”在冒号的前后都不填任何信息,表示从第 0 行取到最后一行。 # 逗号前表示取行,逗号后表示取列。 x_data表示取所有行的第 1 列, # 下标从 0 开始;y_data表示取所有行的第 2 列 x_data = data [ : , 0 ] y_data = data [ : , 1 ] # 调用matplotlib包来画图。scatter表示画散点图 plt . scatter ( x

Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

北战南征 提交于 2020-01-02 01:09:13
生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: 执行效果如下: 可以看到没有任何的结果输出,这说明程序已经可以顺利执行。对于迭代器来讲需要用next()方法来获取值,修改主函数为以下情况可以打印输出前4个整数的立方数: 输出结果如下: 到此可以看到,生成器生成的值需要使用next()方法一个一个的取,它不会一次性生成所有的计算结果,只有在取值时才调用,这时程序会返回计算的一个值且程序暂停;下一次取值时从上一次中断了的地方继续往下执行。 以取出前3个值为例,下图为生成器代码解析图: 图解

Python核心编程的四大神兽

ε祈祈猫儿з 提交于 2020-01-02 01:08:50
本文将主要分为4大部分,分别介绍Python核心编程中的迭代器、生成器 、闭包以及装饰器。 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值;在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行。 通过一个例子来理解生成器的执行过程。求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: def lifang_ls(): """求1-10所用整数的立方数-列表方式实现""" ls = [] for i in range(1,11): result = i ** 3 ls.append(result) print(ls) if __name__ == '__main__': lifang_ls() 输出结果如下: 当数据量很少时,可以很快得到结果。但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存空间而出现程序崩溃的现象。这是因为当数据量变得非常大的时候,内存需要开辟很大的空间去存储这些数据,内存都被吃了,自然会变慢变卡。使用生成器就能解决这个问题。 对于上述同一个问题用生成器实现如下,将范围扩大到1-10000000: def lifang_generate(): """求1

Java8 ArrayList源码分析

孤街浪徒 提交于 2020-01-01 14:57:46
java.util.ArrayList 是最常用的工具类之一, 它是一个线程不安全的动态数组. 本文将对JDK 1.8.0中ArrayList实现源码进行简要分析. ArrayList 底层采用 Object[] 来存储, 每次添加元素前都会检查数组是否有足够空间容纳新的元素. 若数组空间不足则会进行扩容操作, 即创建一个容量更大的数组 并将已有的元素复制到新数组中. 默认情况下新数组的容量是当前容量的1.5倍. ArrayList使用 Arrays.copyOf 和 System.arraycopy 调用原生(native)方法进行数组复制, 以提高效率. addAll , removeAll 等方法中通常使用 c.toArray 方法来获取容器中所有元素. ArrayList提供了 iterator() 和 listIterator() 两种迭代器, 前者只能向后移动, 而后者可以双向移动. iterator() 只能删除上一个访问的元素, 而 listIterator() 还可以在游标位置添加元素. 两种迭代器都采用fail-fast机制, 即使用 modCount 记录结构性改变(添加删除元素等)的次数, 迭代器在移动前会检查 modCount 是否发生改变. 若 modCount 改变, 则抛出异常中止迭代. 该方法是为了防止其它线程修改容器造成迭代结果不一致.

今日头条架构演进之路

喜夏-厌秋 提交于 2020-01-01 14:06:56
夏绪宏,今日头条架构师,专注对高性能大规模 Web 架构,云计算、性能优化、编程语言理论等方向,PHP committer,HHVM 项目贡献者。2009 加入百度,先后从事大规模 IDC 自运维设施建设、云计算平台的架构设计、贴吧业务性能优化、百度通用 RPC 设计和优化等。2015 年加入今日头条负责基础设施,系统架构设计和优化,解决大流量高并发下的系统性能、可靠性和运维效率等方面的问题。 今天给大家分享今日头条架构演进,前面几位讲师讲了很多具体的干货,我的分享偏重基础设施及架构思路的介绍,我们想法是通过提供更好的基础设施,帮助架构做更好的迭代。 从架构的角度,技术团队应对的压力最主要来自三方面: 服务稳定性。接口的稳定性,让服务更可靠; 迭代速度。迭代速度对于大公司来讲相对没那么重要,规模比较大,生存压力相对小一点,但相对中型小型公司来讲,迭代速度是必须要保证的,时间窗也是一个决定能否成功的重要因素; 服务质量。主要关注用户满意度,它也是一个特别重要的 topic。 今日头条发展特别快,只有 4 年的历史,从人员数量和规模增长来看非常快,在稳定性可用性方面压力比较大,一方面需要快速把业务实现,但在另外一方面,类似这些高可用的问题会经常骚扰工程师:上线就挂、运营活动量大服务崩溃、单机性能顶不住、一个小服务上线把核心服务搞挂了……类似这些问题,技术团队需要如何更好的去应对?

深究递归和迭代的区别、优缺点及实例对比

戏子无情 提交于 2019-12-31 15:50:34
1.迭代是人,递归是神! 从“编程之美”的角度看,可以借用一句非常经典的话: “迭代是人,递归是神!” 来从宏观上对二者进行把握。 从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。 2.递归 递归就是函数自己调用自己。 2.1构成递归需具备的条件: 子问题须与原始问题为同样的事,且更为简单; 2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 2.2递归的基本原理 第一: 每一级的函数调用都有自己的变量。 第二: 每一次函数调用都会有一次返回。 第三: 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序。 第四: 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反。 第五: 虽然每一级递归都有自己的变量,但是函数代码并不会得到复制。 2.3递归优缺点 2.4编写一个递归函数 这个递归函数的功能是什么,怎样调用这个函数,即设计好递归函数的返回值和参数列表 什么时候应该结束这个递归,它的边界条件(出口)是什么(边界条件) 在非边界情况时,怎样从第n层转变成第n+1层(递推公式) 例: int f(int n) {   //出口 if (n > 0) { return n + f(n - 1); } else { return 0; } } 解析: 具体步骤

python基础知识点总结

≯℡__Kan透↙ 提交于 2019-12-30 18:09:59
手写一个完整的装饰器模版 # 用于修复被装饰对象的名称空间 from functools import wrape def wrapper(func): @wraps(func) def inner(*args, **kwargs): # func执行之前的操作 res = func(*args, **kwargs) # func执行之后的操作 return res return inner 简述面向对象三大特性及各自特点 ''' 封装:将属性和方法放在类的内部,通过类的实例化出对象,用对象访问属性或方法,隐藏功能的实现细节,可设置访问权限 好处:提高了代码的复用性,安全性,降低代码的冗余度 继承:实现代码的重用,也可以理解为让类与类之间建立父子关系,使子类拥有父类的属性和方法,并可衍生出自己独有的属性和方法。需要注意的是,在python中存在多继承,这是其他编程语言没有的一个特性 好处:减少代码的重用,提高代码的可读性,规范编程模式 多态:同一个方法,不同对象调用,实现的功能不一样。python中的多态不像其他编程语言,崇尚“鸭子类型”,即不用通过具体的继承关系来约束其他类,只要这些不同的类具有相同的方法名,利用统一的方式来调用 好处:增加代码的灵活度,调用方法,不会影响到类的内部设计 ''' 简述解释性语言和编译性的区别 ''' - 解释型:每次执行程序都要重新编译

python之路——迭代器与生成器

落花浮王杯 提交于 2019-12-29 17:59:18
要了解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 iterable:是可迭代的意思。 首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代。那么如果“可迭代”,就应该可以被for循环了。 这个我们知道呀, 字符串、列表、元组、字典、集合 都可以被for循环,说明他们 都是可迭代的 。 我们怎么来证明这一点呢? from collections import Iterable l = [1,2,3,4] t = (1,2,3,4) d = {1:2,3:4} s = {1,2,3,4} print(isinstance(l,Iterable)) print(isinstance(t,Iterable)) print(isinstance(d,Iterable)) print