递归调用

File类的基本概念与递归

回眸只為那壹抹淺笑 提交于 2019-12-28 14:27:42
一、File类 1、概念 File类:是文件和目录路径名的抽象表示形式。 即, Java 中把文件或者目录(文件夹)都封装成 File 对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到 File 这个类即可。 2、File 类的构造函数 例: //File类构造方法不会给你检验这个文件或文件夹是否真实存在 File file=new File("e:\\test\\a.txt");//e:\test\a.txt //父文件String类型 e: 子文件String类型 test File file1=new File("e:","test");//e:\test //父文件File类型 File f1=new File("e:","test"); File file2=new File(f1,"a.txt");//e:\test\a.txt//只输入文件名,会默认是本工程路径File file3=new File("src");//e:\javawork\Day15\src 3、 File 类的获取方法 File.pathSeparator,在window系统中表示";" linux中表示":" File.separator,在window系统中表示"\" linux中表示"/" //与系统有关的路径分隔符 win ; linux : System.out

java ->递归

时光怂恿深爱的人放手 提交于 2019-12-28 14:27:26
递归的概述 递归,指在当前方法内 调用自己 的这种现象 public void method(){ System.out.println(“递归的演示”); //在当前方法内调用自己 method(); } 递归分为两种,直接递归和间接递归。 直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。 l 递归的代码演示,计算1-n之间的和,使用递归完成 public class DiGuiDemo { public static void main(String[] args) { //计算1~ num 的和,使用递归完成 int n = 5; int sum = getSum (n); System. out .println(sum); } public static int getSum( int n) { if (n == 1){ return 1; } return n + getSum (n-1); } } 注意:递归一定要有条件限定,保证递归能够停止下来,否则会发生栈 内存溢出 。 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。要有 出口 递归打印所有子目录中的文件路径 编写一个方法用来打印指定目录中的文件路径,并进行方法的调用 要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来 步骤: 1.

TTreeView完整的枚举和递归算法

我只是一个虾纸丫 提交于 2019-12-28 09:11:53
TTreeView完整的枚举和递归算法 一、TTreeView (一)、重要属性 Memo_Test.Lines.Add( ‘TTreeView重要属性:’ +', 1、可见数: '+IntToStr((LAddObject as TTreeViewItem ). VisibleCount ) //:该节点所有展开的下级总数 +', 2、Item个数: '+IntToStr((LAddObject as TTreeViewItem). Count ) //:该节点所有下级总数>=0,末级Count=0 +', 3、几级: '+IntToStr((LAddObject as TTreeViewItem). Level ) //:该节点的级数:级数>=1 +', 4、全局索引: '+IntToStr((LAddObject as TTreeViewItem). GlobalIndex ) //:该节点所有展开的下级的重新的自动索引(作用不大) ); 5、该节点的父节点: (LAddObject as TTreeViewItem). ParentItem 6、该节点被勾选IsChecked: if (LAddObject as TTreeViewItem).IsChecked=True then ; 7、该节点是否展开其下级、展开或收拢其下级: if FTreeViewItemCurrt

快速排序算法原理及实现(单轴快速排序、三向切分快速排序、双轴快速排序)

情到浓时终转凉″ 提交于 2019-12-28 04:10:46
1. 工作原理(定义)   快速排序(Quicksort)是对冒泡排序的一种改进。(分治法策略)   快速排序的基本思想是在待排序的n个记录中任取一个记录(通常取第一个记录)作为基准,把该记录放入适当位置后,数据序列被此记录划分成两部分,分别是比基准小和比基准大的记录;然后再对基准两边的序列用同样的策略,分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。    2. 算法步骤   实现方法两种方法:挖坑法和指针交换法   基准的选择三种方法:1.选择最左边记录 2.随机选择 3.选择平均值 2.1 挖坑法 设置两个变量i、j,排序开始的时候:i=0,j=N-1; 以第一个数组元素作为关键数据,赋值给key,即key=A[0]; 从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]的值交换; 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换; 重复第3、4步,直到i=j;   【3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束】。

排序 之 堆排序 归并排序

陌路散爱 提交于 2019-12-28 04:05:01
堆的概念 堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子结点的值,称为大顶堆;或着每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 堆排序 堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是对顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如此反复执行,就可以得到一个有序序列了。 有上述思想可知,堆排序的两个要点: 1.如何由一个无序序列构建成一个堆? 2.如何在输出堆顶元素后,调整剩余元素称为一个新的堆? /* 堆排序********************************** */ /* 已知L->r[s..m]中记录的关键字除L->r[s]之外均满足堆的定义, */ /* 本函数调整L->r[s]的关键字,使L->r[s..m]成为一个大顶堆 */ void HeapAdjust(SqList *L,int s,int m) { int temp,j; temp=L->r[s]; for(j=2*s;j<=m;j*=2) /* 沿关键字较大的孩子结点向下筛选 */ { if(j<m && L->r[j]<L->r[j+1]) ++j; /*

JavaScript递归函数的几种写法

放肆的年华 提交于 2019-12-28 01:29:49
递归在程序开发过程中会经常用到,在此记录书中看到的几个好的例子以及注意点。 递归函数示例 最经典的求阶乘递归程序 function factorial ( num ) { if ( num <= 1 ) { return 1 ; } else { return num * factorial ( num - 1 ) ; } } 调用过程的问题 尝试如下调用 var anotherFactorial = factorial ; factorial = null ; console . log ( anotherFactorial ( 4 ) ) ; // error 可以发现,运行上述代码会报错,原因在于 factorial 被置为null,但是递归程序内部仍然调用 factorial 本身, 此时就会报错 几种解决方法 使用 arguments function factorial ( num ) { 'use strict' ; if ( num <= 1 ) { return 1 ; } else { return num * arguments . callee ( num - 1 ) ; } } arguments.callee 是一个指向正在执行的函数的指针,因此可以用 它来实现对函数的递归调用。但是在严格模式下不能通过脚本访问 arguments.callee 。

递归算法

泄露秘密 提交于 2019-12-27 21:52:33
一、递归的核心思想就是自己调用自己,一般来说能够用递归解决的问题应满足3个条件: 1.需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的求解方法与原问题完全相同,只是在数量和规模上不同。 2.递归调用的次数必须是有限的。 3.必须有结束递归的条件来终止递归。 二、何时使用递归? 1.定义是递归的 有许多数学公式、数列和概念的定义是递归的。比如求n!,Fibonacci数列等。这些问题的求解过程是可以将其递归定义直接转化为对应的递归算法的。 比如求 n! int fun(int n) { if(n==1) { //递归头 return(1); } else { //递归体 return (fun(n-1)*n); } } 2.有些数据结构是递归的 单链表就是一种递归数据结构,其结点类型定义如下: typedef struct LNode { ElemType data; struct LNode *next; }LinkList; 求一个不带头结点的单链表L所有的data域(假设为int类型)之和的递归算法如下: int Sum(LinkList *L) { if (L == NULL) { return 0; } else { return(L->data+sum(L->next)); } } 3.问题的求解方法是递归的 比如汉诺塔问题: 三、递归的不足

重读算法导论之算法基础

本小妞迷上赌 提交于 2019-12-27 14:51:32
重读算法导论之算法基础 插入排序 ​ 对于少量数据的一种有效算法。原理: 整个过程中将数组中的元素分为两部分,已排序部分A和未排序部分B 插入过程中,从未排序部分B取一个值插入已排序的部分A 插入的过程采用的方式为: 依次从A中下标最大的元素开始和B中取出的元素进行对比,如果此时该元素与B中取出来的元素大小关系与期望不符,则将A中元素依次向右移动 ​ 具体代码如下: public static void insertionSort(int[] arr) { // 数组为空或者只有一个元素的时候不需要排序 if (arr == null || arr.length <= 1) { return; } // 开始插入排序,先假设元素组第一个元素属于已经排好序的A部分,依次从B部分取出元素,进行比较插入 for (int j = 1; j < arr.length; j++) { int key = arr[j]; int i = j - 1; for (; i >= 0; i--) { if (arr[i] > key) { arr[i + 1] = arr[i]; } else { break; } } arr[i+1] = key; } } ​ 易错点为,最后应该是设置arr[i + 1] = key。 可以设想假设A中所有元素都比B中选出来的数小的时候

Contest100000586 - 《算法笔记》4.6小节——算法初步->two pointers

大憨熊 提交于 2019-12-27 00:43:45
常用模板 two pointers:利用问题本身与序列的特性,使用两个下标 i,j 对序列进行扫描(可以同向扫描,也可以反向扫描),以较低的复杂度(一般是 O ( n ) O(n) O ( n ) )解决问题。 定和问题 给定一个 递增 的 正整数序列 和一个正整数M,求序列中的两个 不同位置 的数a和b,使得它们的和恰好为M,输出 所有 满足条件的方案。 模板如下: while ( i < j ) { if ( a [ i ] + a [ j ] == m ) { cout << i << ' ' << j ; ++ i ; -- j ; } else if ( a [ i ] + a [ j ] < m ) ++ i ; else -- j ; } 由于 i 的初值为0,j 的初值为n - 1(i,j 分别指向序列的第一个和最后一个元素),而 i 只递增,j 只递减,循环当 i >= j 时停止,因此 i 和 j 的操作最多为n次。即时间复杂度为 O ( n ) O(n) O ( n ) 。 序列合并问题 假设有两个递增序列A与B,要求将它们合并为一个递增序列C。设置两个下标 i 和 j,初值均为0,分别指向序列A和序列B的第一个元素。 int Merge ( int A [ ] , int B [ ] , int C [ ] , int n , int m ) { int i

python之函数

谁说我不能喝 提交于 2019-12-26 21:38:09
Python之函数 标签(空格分隔): 函数 现在老板要求你写一个监控程序,24小时全年无休的监控你们公司的网站服务器的系统的状况,当CPU、memory、disk等指标的使用量超过阀值时即发邮件警报 你会采取如下的方法: 2.上述代码是实现了功能但是重复代码太多了:不易维护,如果日后需要修改发邮件的代码,就会很麻烦,每个地方都要遍历一遍; 3.因此只需要把重复的代码提取出来,放在一个公共的地方,起一个名字,以后谁想用这段代码,就通过这个名字调用就行了,如下: 例如:如下的一个简单的函数: def syhi():#the name of def print("hello world") syhi()# 调用函数 备注:函数名是指向内存这段代码的地址,只有加上括号是执行内存里面的具体的内容; 另一种内容是带参数的函数:例如当你想用同一个函数,但是有些地方又是不一样的,这时候怎么办呢,就使用参数; a=7 b=5 c=a**b print(c) #另一种是函数的形式: def calc(x,y) res=x**y return res # return the result c =calc(a,b) print(c) 放了参数的函数在调用的时候一定要传参数,不然会报错的; 函数的特性:减少重复代码,使程序变的可扩展,使程序变得易于维护; 函数的默认参数 1.形参: