fn

浅谈对递归算法的理解……

妖精的绣舞 提交于 2019-11-29 00:52:54
递归: 所谓递归,就是既有传递,又有回归,与其说是传递与回归,初学不如理解是一种 “循序递进”与“规律约束”。 为什么这样说,因为递归算法相比较于循环在代码结构方面个人认为更加简洁清晰,清晰易懂,递归注重的是一种有序的规律,所以在每个程序开始之前,我们只要能找到一个使程序循序递进的规律;并且在整个过程都在用此规律进行传递,但是递归算法也有很大的缺点,会造成内存空间不足,从而形成内存溢出;所以针对这种缺点,就会引入“规律约束”,在每一次算法的的开始之前,先对算法进行一个规律约束,而这种约束可以理解为一个“归期”;即到这个归期不得已而为之…… eg:1 计算1+2+3+4+……+100的值。 function fn(n){ if(n==1)return 1; //归期 return n+fn(n-1); //规律 } console.log(fn(100)); eg:2 计算n 和 1/n!的阶乘。 1. n!function fn(n){ if(n==1)return 1; //归期 return n*fn(n-1); //规律 } console.log(fn(5));2. 1/n! function fn(n){ if(n==1)return 1; //归期 return 1/n*fn(n-1); //规律 } console.log(fn(5)); eg:3 斐波拉契数列

js中this的指向

半世苍凉 提交于 2019-11-29 00:51:18
this 只有在运行时才能确认值,定义时无法确认值。(根据其所在的运行环境,重要!!!) 例: var a = { age:12, fn:function(){ console.log(this.age) } } ① a.fn() //this === a ② a.fn.call({age:13}) //this === {age:13} ③ var f1 = a.fn f1(); //this === window this的使用场景 ① 在构造函数中使用 this代表new出来的对象 function Foo(){ this.b = 10; console.log(this);//Foo {b:10} } var foo = new Foo(); console.log(foo.b)//10 ② 在普通函数中使用 在全局环境中,this 永远指向 window。 var a = 10; function foo(){ console.log(this) //window console.log(this.a)//10 } foo(); ③ call bind apply 当一个函数被 call、apply 或者 bind 调用时,this 的值就取传入的对象的值。 var obj = { a:10 } function foo(){ console.log(this)//{a

箭头函数

旧巷老猫 提交于 2019-11-29 00:30:05
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> </body> <script> // 函数分类: // 有名 // 无名 // 匿名 // 箭头函数 类似于 无名函数 ()=>{} // 不允许直接存在,值存在 // 值存在,赋值式 // 实参,回调函数 // 事件处理函数 // 匿名函数的函数体 var fn = ()=>{ console.log(1) }; console.log(fn)//()=>{console.log(1) }; console.log(typeof fn)//function fn();// // var fn = a=>"你好"+a; var fn = a=>({a:10,b:20}); // console.log(fn("admin"))//{a: 10, b: 20} 不管fn括号内写的什么都没用。 // 简单,方便,快捷,体量小 //

call、apply 的模拟实现

谁说胖子不能爱 提交于 2019-11-29 00:17:47
1. call的模拟实现 Function.prototype.myCall = function (context = window, ...args) { context = context || window // 如果没有context参数,就返回window if (this === Function.prototype) { return undefined // 直接调用Function.prorotype.myCall() 反回undefined } fn = Symbol() context[fn] = this // 为context设置Symbol属性,并将当前函数赋给该属性 const result = context[fn](...args) // 将参数传入 delete context[fn] // 删除该属性 return result } Symbol属性特性: 唯一性,可以作为对象的属性,有静态属性Symbol.iterator 2. apply的模拟实现 Function.prototype.myApply = function (context = window, args) { context = context || window if (this === Function.prototype) { retrun undefined }

jquery属性的相关js实现方法

纵饮孤独 提交于 2019-11-28 23:52:23
转载: https://www.haorooms.com/post/js_shixian_jquery 有些公司手机网站开发不用第三方的jquery或者zeptio,直接用原生的javascript。原生javascript功能是蛮强大的,只不过部分属性不支持IE8以下浏览器。下面对jquery相关方法,如何用js来实现,做一些简单总结。 元素操作 Add Class //JQUERY $(el).addClass(className); //js //谷歌浏览器,火狐浏览器,IE8+ if (el.classList) el.classList.add(className); else el.className += ' ' + className; //谷歌浏览器,火狐浏览器,IE10+ el.classList.add(className); After //JQUERY $(el).after(htmlString); //js 谷歌浏览器,火狐浏览器,IE8+ el.insertAdjacentHTML('afterend', htmlString); Append //JQUERY $(parent).append(el); //js谷歌浏览器,火狐浏览器,IE8+ parent.appendChild(el); Before //JQUERY $(el).before

机器学习排序算法:RankNet to LambdaRank to LambdaMART

守給你的承諾、 提交于 2019-11-28 23:51:31
使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节。 学习过程中细读了两篇不错的博文,推荐给大家: 梯度提升树(GBDT)原理小结 徐博From RankNet to LambdaRank to LambdaMART: An Overview 但经过一番搜寻之后发现,目前网上并没有一篇透彻讲解该算法的文章,所以希望这篇文章能够达到此目的。 本文主要参考微软研究院2010年发表的文章 From RankNet to LambdaRank to LambdaMART: An Overview 1 1,并结合自己的理解,试图将RankNet、LambdaRank和LambdaMART这三种算法的所有算法细节讲解透彻。 1. 概述 RankNet、LambdaRank和LambdaMART是三个关系非常紧密的机器学习排序算法。简而言之,RankNet是最基础,基于神经网络的排序算法;而LambdaRank在RankNet的基础上修改了梯度的计算方式,也即加入了lambda梯度;LambdaMART结合了lambda梯度和MART(另称为GBDT,梯度提升树)。这三种算法在工业界中应用广泛,在BAT等国内大厂和微软谷歌等世界互联网巨头内部都有大量应用,还曾经赢得“Yahoo!Learning To Rank Challenge(Track 1)"的冠军

封闭了内心却包容了天下,闭包你并不孤独

混江龙づ霸主 提交于 2019-11-28 23:25:25
起点 本文之所以会写这种老生常谈的文章,是为了接下来的设计模式做铺垫。既然已经提笔了,就打算不改了,继续写下去,相信也一定有很多人对闭包这样的概念有些模糊,那就瞧一瞧、看一看 毕竟闭包和高阶函数这两种概念,在开发中是非常有分量的。好处多多,妙处多多,那么我们就不再兜圈子了,直接开始今天的主题,闭包&高阶函数 闭包 闭包是前端er离不开的一个话题,而且也是一个难懂又必须明白的概念。说起闭包,它与变量的作用域和变量的生命周期密切相关。 这两个知识点我们也无法绕开,那么就一起了解下吧 变量作用域 首先变量作用域分为两类:全局作用域和局部作用域,这个没话说大家都懂。我们常说的变量作用域其实也主要是在函数中声明的作用域 在函数中声明变量时没有var关键字,就代表是全局变量 在函数中声明变量带有var关键字的即是局部变量,局部变量只能在函数内才能访问到 function fn() { var a = 110; // a为局部变量 console.log(a); // 110 } fn(); console.log(a); // a is not defined 外部访问不到内部的变量 上面代码展示了在函数中声明的局部变量a在函数外部确实无法拿到。小样儿的还挺嚣张,对于迎难而上的coder来说,还不信拿不下a了 客官,莫急,且听风吟。大家是否还记得在js中,函数可是“一等公民”啊,大大滴厉害

【JS】深入理解JS原型和继承

回眸只為那壹抹淺笑 提交于 2019-11-28 22:37:00
前言  在学习JS中的原型,原型链,继承这些知识之前,我们先学习下基础知识:函数和对象的关系。  我们一直都知道,函数也是对象的一种,因为通过instanceof就可以判断出来。但是函数和对象的关系并不是简单的包含和被包含的关系,这两者之间的关系还是有点复杂的。接下来我们就来捋一捋。 首先,阐述一点,对象都是通过函数创建的 对于下面这种类型的代码,一般叫做“语法糖” var obj = {a:10,b:20}; var arr = [5, 'x', true]; 但是,其实上面这段代码的实质是下面这样的: //var obj = { a: 10, b: 20 }; //var arr = [5, 'x', true]; var obj = new Object(); obj.a = 10; obj.b = 20; var arr = new Array(); arr[0] = 5; arr[1] = 'x'; arr[2] = true; 而Object和Array都是函数,可以自己用typeof函数进行验证。 所以,可以得出:对象都是通过函数创建的 正文 说完了前言,接下来我们进入正题。 1. 原型prototype 在前言中,我们说了函数也是一种对象,所以函数也是属性的集合,同时,也可以对函数进行自定义属性。 每个函数都有一个属性——prototype

[矩阵乘法] CF 1182 E.Product Oriented Recurrence

二次信任 提交于 2019-11-28 21:53:50
F n = c 2n-6 * F n-1 * F n-2 * F n-3 ,求 F n . 推一下式子,变成 F n * c n = ( F n-1 * c n-1 ) * ( F n-2 * c n-2 ) * ( F n-3 * c n-3 ) 记 T n = F n * c n ,就有 T n = T n-1 * T n-2 * T n-3 . 再推一下,T n = T n-2 2 * T n-3 2 * T n-4 , T n 的指数就是可以 ( a , b , c ) ----- > ( b+a , c+a , a ) 递推的, 这个显然是可以矩阵乘法优化的,式子很容易推就不放了。 要注意的是矩阵乘法求出来的是指数,所以中间过程是对 p - 1 取模, 因为 a t mod p = a t mod (p-1) mod p,p为质数 . 1 #include<bits/stdc++.h> 2 #define rep(i,a,b) for(register int i=a;i<=b;++i) 3 #define rpd(i,a,b) for(register int i=a;i>=b;--i) 4 #define rep1(i,x) for(register int i=head[x];i;i=nxt[i]) 5 typedef long long ll; 6 const

[pytorch] PyTorch Hook

谁都会走 提交于 2019-11-28 21:05:43
PyTorch Hook ¶ 为什么要引入hook? -> hook可以做什么? 都有哪些hook? 如何使用hook? 1. 为什么引入hook? ¶ 参考: Pytorch中autograd以及hook函数详解 在pytorch中的自动求梯度机制(Autograd mechanics)中,如果将tensor的requires_grad设为True, 那么涉及到它的一系列运算将在反向传播中自动求梯度。 In [0]: x = torch.randn(5, 5) # requires_grad=False by default y = torch.randn(5, 5) # requires_grad=False by default z = torch.randn((5, 5), requires_grad=True) a = x + y b = a + z print(a.requires_grad, b.requires_grad) False True 但是自动求导的机制有个我们需要注意的地方: 在自动求导机制中只保存叶子节点,也就是中间变量在计算完成梯度后会自动释放以节省空间. 所以下面代码我们在计算过程中只得到了z对x的梯度,而y和z的梯度都在梯度计算后被自动释放了,所以显示为None. In [0]: x = torch.tensor([1,2],dtype