递归

java-API之File文件流

寵の児 提交于 2020-03-06 10:02:29
创建File对象 File(String pathname) //通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 常用方法及其测试 File file = new File("F:\\ioTest\\1.txt"); // 本地磁盘路径 // 常见方法 System.out.println( file.length() ); // 获取文件的字节量 System.out.println( file.exists() ); // 判断文件是否存在 System.out.println( file.isFile() ); // 判断资源是否存在 System.out.println( file.isDirectory() ); // 判断资源是否是文件夹 System.out.println( file.getName() ); // 获取文件名 System.out.println( file.getParent() ); // 获取父目录 System.out.println( file.getAbsolutePath() ); // 获取 当前文件的绝对路径(全路径) System.out.println(); file = new File("F:\\ioTest\\2.txt"); // 没有了创建返回true,有了不创建返回false System

py04_03:函数之递归函数

Deadly 提交于 2020-03-06 02:15:05
递归函数的定义:在函数内部,函数自身调用自己的return值,就叫做递归函数   要求:1. 必须有一个明确的结束条件:      2. 每次相对减少,不可能增加,否则永远不能结束,则出错      3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)  来源: https://www.cnblogs.com/yeyu1314/p/12424100.html

06_递归

佐手、 提交于 2020-03-06 01:20:46
样例输入: 3 4 样例输出: 4 3 2 4 3 1 4 2 1 3 2 1 AC代码 # include <stdio.h> # include <algorithm> # include <vector> using namespace std ; int m , n ; vector < int > hashtable ; vector < int > ans ; void toarray ( int index ) { if ( index == 3 ) { for ( int i = 0 ; i < 3 ; i ++ ) { printf ( "%d " , ans [ i ] ) ; } printf ( "\n" ) ; return ; } for ( int i = n ; i >= 1 ; i -- ) { if ( hashtable [ i ] == 0 && ( ans . size ( ) == 0 || i < ans [ ans . size ( ) - 1 ] ) ) { hashtable [ i ] = 1 ; ans . push_back ( i ) ; toarray ( index + 1 ) ; ans . pop_back ( ) ; hashtable [ i ] = 0 ; } } } int main ( ) { scanf

【数据结构与算法之美】排序优化:如何实现一个通用的、高性能的排序函数?

我与影子孤独终老i 提交于 2020-03-05 22:04:21
目录 一、如何选择合适的排序算法? 1.排序算法一览表 2.为什选择快速排序? 二、如何优化快速排序? 三、通用排序函数实现技巧 四、课后思考 一、如何选择合适的排序算法? 1.排序算法一览表 时间复杂度 是稳定排序? 是原地排序? 冒泡排序 O(n^2) 是 是 插入排序 O(n^2) 是 是 选择排序 O(n^2) 否 是 快速排序 O(nlogn) 否 是 归并排序 O(nlogn) 是 否 桶排序 O(n) 是 否 计数排序 O(n+k),k是数据范围 是 否 基数排序 O(dn),d是纬度 是 否 2.为什选择快速排序? 1)线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,不能选择线性排序。 2)为了兼顾任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。 3)同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。 二、如何优化快速排序? 导致快排时间复杂度降为O(n)的原因是分区点选择不合理,最理想的分区点是:被分区点分开的两个分区中,数据的数量差不多。如何优化分区点的选择?有2种常用方法,如下: 1.三数取中法 ①从区间的首、中、尾分别取一个数,然后比较大小,取中间值作为分区点。 ②如果要排序的数组比较大,那“三数取中”可能就不够用了,可能要“5数取中”或者“10数取中”。 2.随机法

递归算法

℡╲_俬逩灬. 提交于 2020-03-05 19:55:21
直接或间接调用函数本身,则该函数称为递归函数。 舍得舍得,有舍才有得。 递归递归,有递才有归。 递归,先确定终止条件或者说是出口。当参数为何值时,递归结束,之后直接把结果返回。注意,确定出口时前几个数可能不能用规律得出,需要一 一确定下来。 再根据不同的条件进行变化,即找出函数的等价关系式。 举一个简单例子 Fibonacci具体 : int fib ( int n ) { if ( n <= 1 ) return 1 ; return fib ( n - 1 ) + fib ( n - 2 ) ; } 再举个经典例子阶乘 int f ( int n ) { if ( n == 0 ) return 1 ; else return n * f ( n - 1 ) ; } 实际上递归虽然看似很精简,实际效率很低,时间复杂度可达到O(2^N )。 递归调用实际上是函数自己在调用自己,而函数的调用开销是很大的,系统要为每次函数调用分配存储空间,并将调用点压栈予以记录。而在函数调用结束后,还要释放空间,弹栈恢复断点。所以说,函数调用不仅浪费空间,还浪费时间。 ——作者:Clemente 链接:https://www.jianshu.com/p/7a10b0221964 来源: CSDN 作者: 恋霏雨 链接: https://blog.csdn.net/z2431435/article

带你走进Debug的世界(基于Eclipse、IntelliJ IDEA)

断了今生、忘了曾经 提交于 2020-03-05 18:36:15
关于Debug和本文 Debug,意为“调试”,是程序员必备技能之一。 想写Debug的文已经很久了,因为我刚学Java的时候也不会Debug,学校也不讲(我们那课叫面向对象程序设计基础,不是Java开发技术啥的),就没好好讲Debug,说是可以自己学啊或者使用System.out.println()啊,可惜我也一直没找到看得懂的东西。直到后来,做一个小型项目,我遇到了很多的NullPointerException,不得不自己琢磨Debug怎么用,顺便请教了一下老师和朋友,就基本学会了使用Debug。 Debug开始用的时候还是很不习惯的,但慢慢用久了,就很香了。 我呢,倒不想把本文写的很复杂,只是希望能给初学者一份导引吧。 对于某些“大佬”,你的技术固然尚可,但做人大可不必过于刻薄,感谢! Debug的三种手段 断点(breakpoint) 打上断点以后,程序运行到断点处就会暂停,可以一步一步观察运行情况。 跟踪(trace) 跟着流程一步一步走,看看程序代码的执行流程。 跟着流程一步一步走,看看变量动态的变化情况。 监视(watch) 即时监视:鼠标指向变量。 快速监视:点右键,Inspector。 添加监视:点右键,Watch。 IntelliJ IDEA 最简单的程序 先随着一个最简单的程序看IDEA的Debug流程。 我们选择一个1+2+…+10的程序

二叉树遍历的递归与非递归实现(python)

只愿长相守 提交于 2020-03-05 16:32:31
最近在刷leetcode时,刷到了二叉树中序遍历的题目,所以特在此记录一下,下面我将给出中序遍历的递归实现和非递归(迭代)实现的代码与算法思想: 1. 中序遍历的递归实现: 1 class TreeNode(object): 2 def __init__(self, x): 3 self.val = x # 节点存储的值 4 self.left = None # 左子节点 5 self.right = None # 右子节点 6 7 class solution: 8 def __init__(self): 9 self.__result_list = list() # 存放中序遍历结果的集合 10 def inorder_traversal(self, root : TreeNode) -> list: 11 if root == None: return # 判断节点是否为空 12 self.inorder_traversal(root.left) # 递归遍历左子树 13 self.__result_list.append(root.val) # 将节点的值存放到集合中 14 self.inorder_traversal(root.right) # 递归遍历右子树 15 return self.__result_list # 返回集合 递归实现的算法思想:先中序遍历左子树

单链表反转(递归和非递归) (Java)

纵饮孤独 提交于 2020-03-05 14:01:58
链表定义 class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } View Code 非递归实现很简单,只需要遍历一遍链表,在遍历过程中,把遍历的节点一次插入到头部。 public ListNode reverseList(ListNode head) { ListNode prev = null; while(head!=null){ ListNode tmp = head.next; head.next = prev; prev = head; head = tmp; } return prev; } View Code 递归实现:翻转head->为首的链表, 然后head变为尾部节点 public ListNode reverseList(ListNode head) { if(head==null||head.next ==null) return head; ListNode prev = reverseList(head.next); head.next.next = head; head.next = null; return prev; } View Code 来源: https://www.cnblogs.com/tina-smile/p/4878983.html

JavaScript中的递归函数问题

落爺英雄遲暮 提交于 2020-03-05 13:33:30
学过其它编程语言的都应该会知道递归这个问题,递归函数是在一个函数通过名字调用自身的情况下后构成的。 function fac(num){ if(num<=1){ return 1; }else{ return num*fac(num-1); } } 这是一个比較经典的阶乘算法。这个写法就实现我们所说的递归。这个代码看起来是没有什么问题, 在c或者其它编程语言都有这种描写叙述。可是在JavaScript中有时就会出错。 就比方: <span style="white-space:pre"> </span>var myfac=fac; fac=null; console.log(myfac(4));//出错了 为什么会出错呢? 依照道理fac把原始函数引用给了myfac,然后将fac置为空,指向原始函数的引用依旧在myfac中,应该能够訪问到才对啊。这个就出现故障了,在调用myfac的时候,因为必须运行fac()。而此时fac已经不再是一个函数了,所以才会导致错误,在这种情况下使用arguments.callee(指向正在运行的函数)能够解决问题。 function fac(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } 通过使用arguments.callee取代函数名

1、算法初识

痴心易碎 提交于 2020-03-05 12:42:10
1.什么是 算法 ? 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。 也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。 不同的算法可能用不同的时间、空间或效率来完成同样的任务。 一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。 一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。 1.1特征 一个算法应该具有以下五个重要的特征: 有穷性 (Finiteness) 算法的有穷性是指算法必须能在执行有限个步骤之后终止; 确切性 (Definiteness) 算法的每一步骤必须有确切的定义; 输入项 (Input) 一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 输出项 (Output) 一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 可行性 (Effectiveness) 算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步