递归调用

一个页面从输入URL到加载显示完成,发生了什么?

二次信任 提交于 2019-12-05 10:55:05
面试经典题——URL加载 一、涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns、http):DNS解析成IP并完成http请求发送; 传输层(tcp、udp):三次握手四次挥手模式建立tcp连接; 网络层(IP、ARP):IP寻址; 数据链路层(PPP):将请求数据封装成帧; 物理层:利用物理介质传输比特流(传输的时候通过双绞线、电磁波等) OIS七层框架 :多了两层即,会话层(处理两个通信系统中交换信息的表示方式)和表示层(管理不同用户和进程之间的对话)。 get和post的区别 : get产生一个tcp数据包,post产生两个 get请求时会把headers和data数据一起发送出去; post请求时,浏览器先发送headers,服务器100继续,浏览器再发送data。 DNS查询得到IP 请求信息:首先查看域名的本地DNS缓存,该缓存存储计算机最近检索到的信息,如果计算机不知道答案,那么就需要执行一个DNS查询来查找答案; 询问递归式DNS服务器: 如果信息不存储在本地,计算机会联系您的ISP(网络提供商)的递归DNS服务器; 这些专用计算机会为你执行一个DNS查询工作; 递归服务器有自己的缓存,所以这个查询过程通常在这里完成,并将信息还回给用户; 询问根域名服务器 如果递归服务器没有答案,他们会查询根域名服务器; 根域名服务器是一种计算机

浅谈递归函数

我的未来我决定 提交于 2019-12-05 09:04:17
1.什么是递归函数: 就是在函数体内调用本函数。是一种调用模式,是一种逻辑程序基础的体现 (类似于循环)。 当我们知道了什么是递归函数以后接下来的问题就是: 怎么写递归函数: (1)声明函数(这里的步骤和普通函数的声明一样)。 (2)找使递归函数 停止的条件 (也是递归函数里最重要的一点) (3)找关系(此时假设函数的功能已经实现,要找的关系就是找 f(n)与f(n-1) 的关系) (4)用f(n-1)去实现f(n)的功能。 下面看一个简单的例子: 利用递归求斐波那契数列(1,1,2,3,5,8,13,21,34,55,89...) // 第一步:先声明函数fn; // 第二步:找临界关系:通过观察可以发现第一位和第二位的值都为1,所以临界值为n=1或者n=2时直接返回1,函数终止。 // 第二步:观察数列可以发现从第三位的值=第一位+第二位;第四位的值=第二位+第三位...依次类推 // 可以写成如下方式: // 5 = 3 + 2 // 1+2 + 1+1 // 1+1 //第三步:通过上面的拆分发现上面的式子可以表达为: // fn(5) =fn(4) + fn(3) // fn(2)+fn(3) + fn(2)+fn(1) // fn(2)+fn(1) //第四步:通过看上面的式子已经可以很明显的看出fn(n)与fn(n-1)的关系所以fn(n)=fn(n-1)+fn(n

经典排序算法

随声附和 提交于 2019-12-05 08:34:10
  排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序。 O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序。 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 名词解释: n:数据规模 k:“桶”的个数 In-place:占用常数内存,不占用额外内存 Out-place:占用额外内存 稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同 冒泡排序   冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

DOM深度优先遍历算法

妖精的绣舞 提交于 2019-12-05 07:02:38
通过深度优先遍历算法,可以依次获取每个后代节点的对象。 顺序:有子元素先获取子元素,再获取兄弟元素 主要有2步骤: //1.创建节点迭代器对象(parent是要遍历的节点) var iterator = document.createNodeIterator(parent, NodeFilter.SHOW_ELEMENT, null, false); //2.反复调用iterator的nextNode方法跳到下一个 do{   var node = iterator.nextNode();   if(node != null) console.log(node.nodeName);   else break; }while(true); 以上也可以使用递归实现,但递归效率较低,不建议使用。 来源: https://www.cnblogs.com/1016391912pm/p/11912503.html

递归组件

自闭症网瘾萝莉.ら 提交于 2019-12-05 06:58:34
思路:1.组件有name来调用 ,2. 树形结构的数据 这个组件单独出来,不然如果有其他内容 ,递归时会重复不必要的内容 。 <div class="item" v-for="(item, index) of categoryList" :key="index" > <div class="item-title"> <span class="item-title-icon"></span> {{item.title}} </div> <div class="item-title-children" v-if="item.children"> //判断是否有数据中是否有 children 这个属性,如果有就使用递归组件 <detail-list :categoryList="item.children"></detail-list> //把 children 传给递归组件 </div> </div> 注释的地方就是关键实现点 "categoryList": [{ "title": "成人票", "children": [{ "title": "成人三馆联票", "children": [{ "title": "成人三馆联票 - 某一销售店" }] }, { "title": "成人五馆联票" }] }, { "title": "儿童票" }, { "title": "学生票" },

第二月 day3 闭包,递归

会有一股神秘感。 提交于 2019-12-05 06:05:00
1. 不断调用自己本身(自己调用自己)——死循环 最大层次1000,实际测试997/998 2 . 有明确的终止条件 满足以上两个才是 有效递归。 递 :一直执行直到碰到结束条件 归 :从结束条件开始往回退 最大递归深度998 • 1 . 闭包是嵌套在函数中的函数。 • 2 .闭包必须是内层函数对外层函数变量(非全局变量)的引用。 • 3. 外层函数返回内层函数名 •闭包的作用 :保存局部信息不被销毁,保证数据的安全性。 •闭包的应用 :装饰器 来源: https://www.cnblogs.com/wyfmc/p/11909508.html

JAVA--高级基础开发

梦想与她 提交于 2019-12-05 05:04:58
Day10【File 类,递归】 第一章 File类 概述 File类位于java.io.File 包中,是文件和目录路径名的抽象表示,主要用于文件和目录的创建,查找,删除等操作。 File类构造方法 public File(String pathname):通过将给定的路径字符串转换为抽象路径名来创建file对 象。 public File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File 对象 Public File(File parent, String child):从父路径名字符串和子路径名字符串创建新的 File 对象. File 类构造方法的示例 //File 创建对象 位于java.io.File public class Test01 { public static void main(String[] args) { //构造方法 //创建File对象方式一 File f=new File("f:\\aaa\\sss\\text.txt"); //创建File对象方式二 File s=new File("f:\\", "aaa\\sss\\text.txt"); //创建File对象方式三 File q=new File("f:\\"); File q1=new File(q,"aaa\\sss\

迭代与递归

佐手、 提交于 2019-12-05 04:35:28
迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。 递归是将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。 迭代是更新变量的旧值。递归是在函数内部调用自身。 https://www.zhihu.com/question/20278387 表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环 算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. 大部分的递归, 遍历, 迭代, 都是循环. 递归 的定义是, 根据一种(几种)基本情况定义的算法, 其他复杂情况都可以被逐步还原为基本情况. 在编程中的特征就是, 在函数定义内重复调用该函数. 例如斐波那契数列, 定义F(0)=1, F(1)=1, 所有其他情况: F(x)=F(x-1)+F(x-2). 所有大于1的整数经过有限次的反推之后都可以转换到两种基本情况. 而在编程中, 算法则是这样的: int F (x) { if (x==0 || x==1) return 1; //这里是退出递归的条件, 以保证在有限次递归后能够得到结果 return F(x-1)+F(x-2); //转化为更为基本的情况,

递归越做越忘,刚开始还写的好,后来就无从下手,看完代码又恍然大悟

我的梦境 提交于 2019-12-05 04:17:57
设一个基准情况;再调用 第二个情况由第一个情况递推,再调用; 达到某个情况,返回值。 有5个人围坐在一起,问第5个人多大年纪,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第1个人说自己10岁,请利用递归法编程计算并输出第5个人的年龄。 include <stdio.h> unsigned int ComputeAge(unsigned int n); main() { unsigned int n = 5; printf("The 5th person's age is %d\n", ComputeAge(n)); } /* 函数功能:用递归算法计算年龄 */ unsigned int ComputeAge(unsigned int n) { unsigned int age; if (n == 1) { age = 10; } else { age = ComputeAge(n - 1) + 2; } return age; } 来源: https://www.cnblogs.com/dosu/p/11905195.html

数据结构与算法-10-递归调用

♀尐吖头ヾ 提交于 2019-12-05 04:11:07
递归详解-典型递归介绍 http://chenqx.github.io/2014/09/29/Algorithm-Recursive-Programming/ 1.如何理解“递归”?(什么是递归) 去的过程叫“递”,回来的过程叫“归”f(n)=f(n-1)+1 备注:去的过程入栈的过程,回来的过程出栈 2.递归需要满足的三个条件(递归的特点) 2.1. 一个问题的解可以分解为几个子问题的解 2.2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 2.3. 存在递归终止条件 3.如何编写递归代码?(怎样实现递归) 3.1写出递推公式,找到终止条件 归纳:写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码 编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤 4.注意点(递归弊端) 递归代码要警惕堆栈溢出 递归代码要警惕重复计算 都可以将递归使用循环+栈实现 来源: https://www.cnblogs.com/mzyc/p/11904890.html