递归

Javascript函数声明与递归调用

元气小坏坏 提交于 2020-04-05 23:02:55
Javascript的函数的声明方式和调用方式已经是令人厌倦的老生常谈了,但有些东西就是这样的,你来说一遍然后我再说一遍。每次看到书上或博客里写的Javascript函数有四种调用方式,我就会想起孔乙己:茴字有四种写法,你造吗? 尽管缺陷有一堆,但Javascript还是令人着迷的。Javascript众多优美的特性的核心,是作为顶级对象(first-class objects)的函数。函数就像其他普通对象一样被创建、被分配给变量、作为参数被传递、作为返回值以及持有属性和方法。函数作为顶级对象,赋予了Javascript强大的函数式编程能力,也带来了不太容易控制的灵活性。 1、函数声明 变量式声明先创建一个匿名函数,然后把它赋值给一个指定的变量: var f = function () { // function body }; 通常我们不必关心等号右边表达式的作用域是全局还是某个闭包内,因为它只能通过等号左边的变量f来引用,应该关注的是变量f的作用域。如果f指向函数的引用被破坏(f = null),且函数没有被赋值给任何其它变量或对象属性,匿名函数会因为失去所有引用而被垃圾回收机制销毁。 也可以使用函数表达式创建函数: function f() { // function body } 与变量式不同的是,这种声明方式会为函数的一个内置属性name赋值

我说我不会排序算法,阿里就挂了我

女生的网名这么多〃 提交于 2020-04-05 22:40:05
前言 工作已经有一段时间了,有的时候会跟同事们打趣:“ 如果你让我现在去手写一个快速排序,我怕是真的写不出来 ”。 如果不接触一段时间的算法,真的很容易就忘了。不信?你现在想想你自己能不能手写一个堆排序。 经历过校招的人都知道, 算法和数据结构 都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以 排序 和各种的 基本数据结构 开始入门。我花了一个星期将 八大基础排序 和 链表/二叉树/栈/队列 制作成一份 精美的PDF 。 这份PDF阅读体验肯定是要比公众号和各大的博客平台的文章要好的。PDF内容 纯手打 ,有不懂的可以来问我。 下面来简单介绍一下八大基础排序和基础的数据结构,每种排序的思想和基础的 讲解和源码 在PDF里边有。 冒泡排序 思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要 n-1 趟排序(比如10个数,需要9趟排序) 代码实现要点: 两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数 。 每趟过后,比较的次数都应该要减1 选择排序

文件递归查找

非 Y 不嫁゛ 提交于 2020-04-04 18:35:42
1 public class BianLiFile { 2 public static void main(String[] args) { 3 //删除或者重命名时只能对单级目录进行操作 4 getFile("D:\\"); 5 } 6 7 //分多次去操作 8 //获取多级目录下的所有文件 9 public static void getFile(String path){ 10 File file = new File(path); 11 //如果只是一个文件或者不存在,就返回 12 if (file.isFile()||!file.exists()){ 13 //如果不是文件或者不存在 14 return ; 15 } 16 File[] files = file.listFiles(); 17 for (File file1 : files) {//如果是一個文件 18 if (file1.isFile()){ 19 System.out.println("文件"+file1.getName()); 20 } 21 else{ 22 System.out.println("目录:"+file1.getName()); 23 getFile(file1.getPath()); 24 25 } 26 } 27 } 28 } 来源: https://www.cnblogs

Java方法

守給你的承諾、 提交于 2020-04-04 17:51:09
什么是方法? Java方法是语句的集合,它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 方法的基础语法 修饰符 返回值类型 方法名(参数类型 参数名){ ... 方法体 ... return 返回值; } 方法包含一个方法头和一个方法体。下面是一个方法的所有部分: 1、修饰符:暂时写成public static。修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。 2、返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void,同时方法体中不能编写“return 值(与返回值类型相同);”这样的语句,但是可以编写“return;”这样的语句。只要带有return关键字的语句执行,return语句所在的方法结束。在有返回值的情况下,必须保证“return 返回值;”语句百分百执行(不能放在if、while这些之中;当然if...else...就可以百分百保证能执行,就可以)。 3、方法名:是方法的实际名称。方法名和参数表共同构成方法签名。要是合法的标识符;方法名最好见名知意;最好是动词;首字母小写,后面每个单词首字母大写。 4、参数类型:形参是局部变量

二分搜索树(Binary Search Tree)

这一生的挚爱 提交于 2020-04-04 09:12:11
目录 什么是二叉树? 什么是二分搜索树? 二分搜索树的基本操作 二分搜索树添加新元素 二分搜索树的遍历(包含非递归实现) 删除二分搜索树中的元素 什么是二叉树?   在实现二分搜索树之前,我们先思考一下,为什么要有树这种数据结构呢?我们通过企业的组织机构、文件存储、数据库索引等这些常见的应用会发现,将数据使用树结构存储后,会出奇的高效,树结构本身是一种天然的组织结构。常见的树结构有:二分搜索树、平衡二叉树(常见的平衡二叉树有AVL和红黑树)、堆、并查集、线段树、Trie等。Trie又叫字典树或前缀树。   树和链表一样,都属于动态数据结构,由于二分搜索树是二叉树的一种,我们先来说说什么是二叉树。二叉树具有 唯一的根节点 ,二叉树每个节点 最多 有两个孩子节点,二叉树的每个节点 最多有一个父亲节点 ,二叉树具有天然递归结构,每个节点的左子数也是一棵二叉树,每个节点的右子树也是一颗二叉树。二叉树如下图: 什么是二分搜索树?   二分搜索树也是一种二叉树,但二分搜索树种每个节点的值都要大于其左子树所有节点的值,小于其右子树所有节点的值,每一棵子树也是二分搜索树。正因为二分搜索树的这种性质,二分搜索树存储的元素必须具有可比较性。下图就是一棵二分搜索树: 我们可以根据二分搜索树的特点,构建一颗二分搜索树,代码实现如下: /** * 由于二分搜索树中的元素必须具有可比较性

排序之归并排序

六眼飞鱼酱① 提交于 2020-04-03 05:01:16
阐述: 归并排序是将两个有序表合并成新的有序表; 而子序列的划分是递归地将待排序集合折半划分多个子序列,类似一个二叉树, 另外上面的递归操作大多会涉及分治思想,通俗讲就是各个分支上的子序列的有序,为最大的序列的有序埋下基础。 所以需要lgN趟的二路合并(假设集合的规模是N),每趟合并的复杂度是O(N),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(N*lgN)。 归并排序在划分子序列,二路合并有序集合时并没有改变两个相同元素的相对位置,故而是稳定的。 但是,归并排序需要额外的临时存储空间来暂存归并好的结果,所以空间复杂度是O(N)。 归并排序的关键字是:有序集合的合并;子序列的划分方式(如二路归并是通过递归地折半划分) 效果图: 大家可以看到处理每一趟归并的走位,就像我们遍历二叉树的顺序。 代码(c#): /// <summary> /// 归并排序入口 /// </summary> public static void DoMergeSort_Entrance() { List<int> listNum = new List<int>() { 25, 19, 6, 58, 34, 10, 7, 98, 160, 0 }; DoMergeSort_Sort(listNum, 0, listNum.Count - 1); } /// <summary> /// 归并排序,

C# 递归搜索目录,历遍文件

谁说胖子不能爱 提交于 2020-04-02 23:40:25
#region 递归搜索目录,历遍文件 /// <summary> /// 递归搜索目录,历遍文件 /// </summary> /// <param name="sDir">目录名</param> void DirSearch(string sDir) { try { foreach (string d in Directory.GetDirectories(sDir)) { foreach (string f in Directory.GetFiles(d)) { FileInfo fi = new FileInfo(f); FileCheck(fi); //如果是文件,执行FileCheck } DirSearch(d); //递归查询 } } catch (System.Exception excpt) { MessageBox.Show(excpt.Message); } } #endregion 来源: https://www.cnblogs.com/ASPXML/archive/2011/11/03/2234561.html

java 基础之 IO

霸气de小男生 提交于 2020-04-02 20:29:22
第1章 File 1.1 IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。 因此我们把这种输入和输出动作称为IO操作。 简单了解IO是怎么一回事之后,接下来就要进一步做系统了解。 在我们操作系统中,数据都保存在文件中,而文件存放相应的文件夹中。那么Java中是如何描述这些的呢? 1.2 File类的出现 打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢? 1.3 File类的构造函数 l 通过构造方法创建File对象,我们进行演示: public class FileDemo { public static void main

java IO操作File类

纵饮孤独 提交于 2020-04-02 20:28:01
---恢复内容开始--- IO操作 把内存上的数据写到可持久化存储的设备上叫输出(Output) 把持久存储数据的设备写到内存上叫输入(Input) File类 把文件和文件夹都封装成文件对象 File类获取对象 1 import java.io.File; 2 3 public class Demo02 { 4 5 public static void main(String[] args) { 6 File f = new File("E:\\java学习\\6月5号"); 7 System.out.println(f.getAbsolutePath()); 8 9 }返回了 E:\\java学习\\6月5号 import java.io.File; public class Demo02 { public static void main(String[] args) { File f = new File("E:\\java学习\\6月5号"); System.out.println(f.getName()); }返回了6月5号 1 import java.io.File; 2 3 public class Demo02 { 4 5 public static void main(String[] args) { 6 File f = new File("E:\

Java的递归、IO流

99封情书 提交于 2020-04-02 20:25:31
/*--> */ /*--> */ 一、递归 [递归]   1、 在函数自身内部,调用函数本身的方式,称为递归。    2、 注意: 递归包括递进去、归出来两步。     首先,依次执行【函数调自身语句】上半部分的代码,直到最里层。 {递进去}      然后,再从最里层开始,依次执行【函数调自身语句】下半部分的代码。 {归出来}   3、 递归必须通过合适的语句,及时的跳出。 否则,容易造成死循环。 public static int num=0;//2 public static void test(){ System.out.println("这是一个函数"); num++; if(num<=2){ test();//if()不成立不再调用自己 }//先执行三次 System.out.println("hahah");//执行完num大于2,hahah在执行之前的三次 } //test类 test(); 结果: 练习:5的阶乘 方法1: /** * 用递归实现5的! */ static int jie=1; public static long jiecheng(int n){ jie*=n; n--; if(n>=1){ jiecheng(5); } return jie; } //Test类: System.out.println(jiecheng(5)); 方法2: