递归调用

递归遍历磁盘文件路径、模拟抽奖、线上解析json

匆匆过客 提交于 2020-03-02 21:45:24
今天机试的三个小题目 1、 递归遍历 磁盘文件路径 使用递归方法,遍历D盘 (也可以更换成别的目录,效果达到即可) 下全部的文件(包括子文件夹下的文件),输出文件路径,文件修改时间,文件按修改时间倒序排列。 package test; import java.io.File; import java.util.*; /** * Created by shimengru on 2020/3/2. * 使用递归遍历apache目录下所有文件的文件名 */ public class ShowFileDir { public static void main(String[] args) { File file = new File("/Users/admin/Downloads/apache-maven-3.6.2/"); //校验路径是否为空 File[] files = file.listFiles(); if (files == null) { System.out.println("请输入正确路径..."); return; } File[] fs = seachFileDir(file);//查询后未排序 //进行排序 Arrays.sort(fs, new CompareByLastModified()); //遍历 for (File f : fs) { System

JavaScript算法--递归!

*爱你&永不变心* 提交于 2020-03-01 21:54:23
今天给大家讲讲递归 递归其实很好理解 举个例子 比如 借钱 你第一天借了 100块 之后每隔一天你就要多还50元 如果你一直不还 这将是个死循环递归 用代码展示如下 // 简单递归 n代表你第几天还钱 function money(n){ if(n<=1){ return 100; } return 50+money(n-1); } 其中 return money(),就是不断直接的调用自身函数返回的值 直到n<=1的时候 递归返回最终结果 递归就是一个间接或直接的调用自身的函数; 其中return 最为关键 没有返回的值,则无法实现递归 输出则是undefind 来源: CSDN 作者: xbyysj 链接: https://blog.csdn.net/xbyysj/article/details/104599311

递归调用的事列,深拷贝对象

不打扰是莪最后的温柔 提交于 2020-03-01 21:03:33
对象的深拷贝也使用到了递归调用,判断是否为多层对象,复制多级数据结构 function deepClone(obj) { // 判断是不是对象 function isObject(o) { return (typeof o === 'object' || typeof o === 'function') && o !== null } // 不是对象的话报错 if (!isObject(obj)) { throw new Error('非对象') } let isArray = Array.isArray(obj) let newObj = isArray ? [...obj] : { ...obj } // 是数组的话 用数组的解构来实现对象的复制,对象也同理 // 静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组 Reflect.ownKeys(newObj).forEach(key => { newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key] // 这里进行递归实现多层对象的复制 }) return newObj } 递归函数必须要有结束递归的条件,不然会形成死循环。 来源: CSDN 作者: 梦幻影巧巧23 链接: https://blog.csdn.net

递归算法的一般思路总结

跟風遠走 提交于 2020-03-01 21:01:13
** 递归算法 ** 程序直接或间接的调用自身的编程技巧称为递归算法,直接或间接调用自身的函数称为递归函数;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 递归问题基本思想:问题层层分析 关键:找出递归定义和递归终止条件 递归定义:使问题向边界条件转化的规则 递归终止条件:所描述问题的最简单的情况,它本身不再使用递归的定义 例: 求1~100的和 递归 fn(n)=n+fn(n-1) 终止条件:fn(1)=1 代码: function fn(n) { If(n<=1) Return 1; Else return n+fn(n-1); } 例: 求最大公因式 (欧几里得算法) 递归: gcd(m,n)=gcd(n,m%n) 终止条件:gcd(m,0)=m 代码: gcd(m,n)//m>n { If(n==0) return(m); else return gcd(n,m m%n); } 例题 求逆波兰表达式 比如说:(2+3) 4 -> * + 2 3 4 比如说 * + 11 12 + 24 35 -> (24+ 35) (11 + 12) = 1357 atof 函数能把char型转换成浮点数 atof():double atof(const char *str ) 思路: 向字符串数组输入,分两种情况,1,是符号,2,是数字

递归总结。

喜夏-厌秋 提交于 2020-03-01 16:05:11
递归的话就是在函数内部调用函数,这类题都是有一定的关联关系的。 递归的关键在于找出 递归定义 和 递归终止条件。 例题一: 集合的全排列问题 例如输入 123 样例输出: 123 132 213 231 321 312 # include <iostream> # include <cstring> using namespace std ; void f ( char a [ ] , int k , int m ) 数组,排列的起始下标,最后的的元素下标。 { if ( k == m ) 如果排到最后了,就输出结果 { for ( int i = 0 ; i <= m ; i ++ ) cout << a [ i ] ; cout << endl ; } else for ( int i = k ; i <= m ; i ++ ) { swap ( a [ i ] , a [ k ] ) ; f ( a , k + 1 , m ) ; swap ( a [ i ] , a [ k ] ) ; 就是回溯。 } } int main ( ) { char b [ 28 ] ; cin >> b ; char a [ 27 ] ; int m = strlen ( b ) - 1 ; for ( int i = 0 ; i <= m ; i ++ ) a [ i ] = b [ i ]

二叉树的非递归遍历与层次遍历

孤人 提交于 2020-03-01 13:50:44
二叉树的递归遍历很好写,也很好理解。但因为是递归程序,不可避免地需要调用系统栈,耗时较长,这里我们来探究一下二叉树的非递归遍历的算法。这种方法需要使用栈这种数据结构,这里关于栈的一些操作函数可以看成伪代码吧,先给出线序、中序、后序遍历的代码即说明。 先序遍历: 1 void PreOrderTraverse(BinTree b) 2 { 3 InitStack(S);///初始化创建栈 4 BinTree p=b;///p为工作指针 5 while(p||!isEmpty(s)) 6 { 7 while(p)///到最左下的孩子 8 { 9 printf(" %c ",p->date);///先序先遍历结点 10 Push(S,p);///入栈 11 p=p->lchild; 12 } 13 if(!isEmpty(s))///在栈不为空的情况下,左孩子为空,弹出该结点,遍历右孩子 14 { 15 p=Pop(s); 16 p=p->rchild; 17 } 18 } 19 } 再给出使用数组模拟的函数 1 void Preorder_n(BiTree bt) /*先序遍历的非递归算法*/ 2 { 3 BiTree stack[MAX],p; 4 int top=0,i; 5 for(i=0; i<MAX; i++) 6 { 7 stack[i]=NULL; /*初始化栈*/ 8

树—最“有套路”的数据结构

ぃ、小莉子 提交于 2020-03-01 09:41:13
前言 标题用“有套路”来形容一种数据结构,似乎有点不尊重的意思。不过,我倒是觉得,一种实用的学科,就是应该产生一点套路,这才能发挥体系化研究的优势,套路就是一种保证: 在不投入更多创造性与努力的情况下,依旧能获得比起随意进行相关操作更好的结果 。一门成熟的学科都应如是,如果研究许久,在学科所研究的许多问题的实践上还不如一些“天赋”“灵感”,那就不得不说这门学科的“伪科学”或者“水分”还是蛮大的了。 言归正传,这篇文章将会是一系列寻找算法与数据结构的文章的开篇,树由于其特性,是递归、分治等等重要算法思想的典型载体,同时套路性较强又具有一定规律和难度,上手后,也可以获得总结其他算法“套路”的必要经验。作为一个训练的开头,还是很合适了。 树的定义与理解 先简要谈谈树的抽象定义:树本质上是一种无向图( 图:由顶点与路径构成的数据结构 ),其中,任意两个顶点之间 有且只有一条 路径。简而言之,树是一种具有特殊性质的图。 树的结构非常直观,而且树的大多数结构具有一个重要性质: 递归 。主要来说,就是树具有某一性质时,往往其子树也具有同样的性质。比如说,一个树如果是二叉搜索树,其子树也必须是二叉搜索树。 根据这样的性质,遇到树的问题,很自然会考虑如何合理使用递归算法,其实质就是:分解为子问题,最后解决基本情况,把复杂的递归过程交给计算机来处理。所以,树类型代码的特点就是简洁(不过换句话说

23.python递归函数介绍

风格不统一 提交于 2020-03-01 00:49:44
不断的对于某操作重复调用执行称为递归调用,递归函数执行的这个过程中只有进栈(开辟空间),没有出栈,直到最后一次调用完毕了,才逐个出栈,所以递归函数在执行的时候非常的占用内存资源;如果执行的次数过多了,会产生内存溢出的现象;所以一定要控制递归的层数,当符合某一条件时要终止递归调用,几乎所有的递归都能用while循环来代替;所以对于递归要慎用!!! 递归函数: 在某个函数中,调用其本身(函数自己调用自己),这个函数整体我们称为递归函数。 如何定义递归函数?(先假设此函数已经实现) 考虑切入点:(1).寻找一个临界点(结束点);(2).本次的函数执行不能满足最终的整体需求,所以还需要再次的去调用此函数;(找到后者和前者之间的关系,体现:后者的调用结束会将前者需要的数据返回回来) 优点:递归可以把问题简单化,让思路使为清淅,代码更简洁。缺点:递归因系统环境影响大,当递归深度太大时,可能会得到不可预知的结果。 演示递归函数调用自身: 1 # 直接调用自身: 2 def f(): 3   f() 4 5 f() 1 # 间接调用自身: 2 def fa(): 3  fb() 4 def fb(): 5   fa() 6 7 fa() 代码演示示例: 1 # 递归求和:0 + 1 + 2 + 3 + 4 + ..... + n 的和 2 def mysum(n): 3 if n == 0: 4

php递归实现无限级分类树

浪尽此生 提交于 2020-02-29 15:31:54
PHP实现无限极分类的两种方式,递归和引用 1 $array = array( 2 array('id' => 1, 'pid' => 0, 'name' => '河北省'), 3 array('id' => 2, 'pid' => 0, 'name' => '北京市'), 4 array('id' => 3, 'pid' => 1, 'name' => '邯郸市'), 5 array('id' => 4, 'pid' => 2, 'name' => '朝阳区'), 6 array('id' => 5, 'pid' => 2, 'name' => '通州区'), 7 array('id' => 6, 'pid' => 4, 'name' => '望京'), 8 array('id' => 7, 'pid' => 4, 'name' => '酒仙桥'), 9 array('id' => 8, 'pid' => 3, 'name' => '永年区'), 10 array('id' => 9, 'pid' => 1, 'name' => '武安市'), 11 ); 递归算法 1 /** 2 * 递归实现无限极分类 3 * @param $array 分类数据 4 * @param $pid 父ID 5 * @param $level 分类级别 6 * @return $list

Javascript中递归的调用

青春壹個敷衍的年華 提交于 2020-02-29 03:32:20
  递归函数就是调用自身,如下所示: 1 function factorial(num){ 2 if(num<=1){ 3 return 1; 4 }else{ 5 return num*factorial(num-1); 6 } 7 }   这是经典的递归调用,但是执行如下代码时会导致出错。 1 var anotherFactorial=factorial; 2 factorial=null; 3 alert(anotherFactorial(3)); //Uncaught TypeError: factorial is not a function   上面的代码先把factorial()函数保存在anotherFactorial中,然后将factorial设置为null。结果指向原始函数的指针只剩下一个,在接下来的调用就会出现错误(factorial已经不是函数),此时使用 arguments.callee (即指向正在执行函数的指针)可以解决这个问题,即: 1 function factorial(num){ 2 if(num<=1){ 3 return 1; 4 }else{ 5 return num*aguments.callee(num-1); 6 } 7 }   但是在严格模式下,不能通过脚本访问aguments.callee。最好的解决方法是使用 命名函数表达式