递归

Oracle树形表和递归查询

拈花ヽ惹草 提交于 2020-02-13 12:35:04
地址: https://blog.csdn.net/hellowordapi/article/details/75763432 在平常的业务系统开发中,我们经常需要设计数据层次关系,如在经典的user-role-permission权限设计中, 需要对权限表的数据设计成一种层次依赖关系,如最顶层的为系统管理,系统管理的下一层为角色 管理,角色管理的下一层又为角色的CRUD操作, 那么这种表就可以抽象成为数据结构里面的B树. 如下表 : CREATE TABLE "U_PERMISSION" ( "ID" NUMBER(20,0), "URL" VARCHAR2(256 BYTE), "NAME" VARCHAR2(50 BYTE), "PARENT" NUMBER(20,0) ) 在上表中 id表示当前树的节点。url, name表示可访问的url路径,name表示url描述。 parent表示当前节点的父节点,如果当前节点是跟节点则parent用0表示(别用NULL违反了数据库约束)。 那么上面的表就可以抽象成如下图. 接着我们插入测试数据 : Insert into U_PERMISSION (ID,URL,NAME,PARENT) values (1,'*','系统管理',0); Insert into U_PERMISSION (ID,URL,NAME,PARENT)

递归:全排列问题

こ雲淡風輕ζ 提交于 2020-02-13 11:38:01
全排列问题 给出 1~n ,n个整数,把这n个整数按照这种顺序输出n个数的所有排列: 按照字典序从小到大顺序输出,如果说 (a1,a2,……an) 的字典序小于 (b1,b2,……bn) ,指的是存在一个 i ,使得 a1=b1,a2=b2,……a(i-1)=b(i-1),ai<bi 例如: 1,2,3 三个数按顺序输出全排列就是 (1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1) 解析 以输入的是 1,2,3 为例,这个问题可以分解成这样的几个小问题: 拿出其中一个问题,以 1 开头的三位全排列内部可以分成三个小问题,这三个小问题其实就是在 1 为开头的基础上,判断第二位后面的各个位 因为 1 已经在第一位出现过了,所以就不会出现在第二位,那么第二位只有两小小个问题 如此递推下去,这就是这道题的解决思想 那么我们可以设置一个 boolean 类型的 HashTable ,用来记录到目前为止,前几位哪些数字已经使用了,已经使用的记为 true 设置一个 index ,指示当前是第几位 假设我们在第一位为 2 ,第二位为 1 的基础上到了第三位,第三位只能是三 3 ,到了这一步,这一种情况已经走到底了, hashTable 都为 true , 之后返回到第二位,第一位的 2 我们不能动,第二位还可以是 3 ,但是由于刚才我们在第三位用到了

递归、尾递归和使用Stream延迟计算优化尾递归

ε祈祈猫儿з 提交于 2020-02-13 10:41:58
我们在学数据结构的时候必然会接触栈(Stack),而栈有一个重要的应用是在程序设计语言中实现递归。递归用途十分广泛,比如我们常见的阶乘,如下代码: 1234 public static int (int n) { if (n == 1) return 1; return n * func1(n - 1);} 就可以用递归实现,而且实现相当简洁。如果要计算n的阶乘,那么只需知道n-1的阶乘再乘以n,同理依次类推,直到当我们计算2的阶乘的时候,只需知道1的阶乘,显然这是递归终止条件,再层层向上返回,直至计算出n的阶乘即可。 从上面的分析可以看出,如果我们要进行递归求解某一问题,需要满足以下两个条件: 能将一个问题转变为另一个新问题,而新问题的解法与原问题相同或者类同,并且新问题的数据规模更小,问题简化。 使用递归的情景是当前数据规模较大,直接计算比较困难,那么可以将该问题进行分解,数据规模越来越小,计算也越来越容易,其实这是“分治法”的体现。 存在递归终止条件,或者说递归的边界。 递归的终止条件是必须的,既然当前问题可以分解,那么就必须存在一个“极限”,分解到什么程度?到哪里停止? “分治法”求解递归问题算法有一个一般形式: 1234 void p(参数列表) { if (递归终止条件成立) 直接求解; // 递归终止条件 else p(较小的参数) // 递归步骤}

C#-TreeView加载(递归)

故事扮演 提交于 2020-02-13 03:07:58
文件资料递归加载: private void frmMain_Load ( object sender , EventArgs e ) { string demopath = Path . Combine ( Path . GetDirectoryName ( Assembly . GetExecutingAssembly ( ) . Location ) , "deom" ) ; //所有文件的根目录 LoadData ( demopath , treeView1 . Nodes ) ; } //递归方法 private void LoadData ( string paths , TreeNodeCollection nodes ) //跟目录路径和控件根节点 { string [ ] dnames = Directory . GetDirectories ( paths ) ; //获取当前目录下的所有子目录(路径和名称) foreach ( var item in dnames ) { //添加根节点 TreeNode IndexNode = nodes . Add ( Path . GetFileName ( item ) ) ; LoadData ( item , IndexNode . Nodes ) ; //递归调用 } /

1.算法设计的基本方法(二)

自古美人都是妖i 提交于 2020-02-13 02:09:06
续上一篇继续写算法设计的基本方法,递推法和递归法 3.递推法 其基本思想就是从前面的一些量推出后面的一些量,它从已知的初始条件出发,逐次推出所要求解的各中间结果和最终结果。 具体实现有两种方式: 递归的和非递归的 递归的递推求解是使用迭代法计算,自顶向下进行; 非递归的地推求解是使用迭代法计算,自底向上。 [例1-16]计算斐波那契数。斐波那契数列存在着如下递推关系: f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2),n≥2 ; 程序如下: int Fib ( int k ) { if ( k < 2 ) return k ; int f0 , f1 , i , fk ; f0 = 0 , f1 = 1 ; for ( int i = 2 ; i <= k ; i ++ ) { fk = f0 + f1 ; f0 = f1 ; f1 = fk ; } return fk ; } 4.递归法 如果一个数据对象包含它自身,则称此对象为递归的; 如果一个过程直接或间接调用它自身,则该过程是递归的。 直接调用自身称作直接递归,间接调用就称间接递归呗! 递归是构造算法的一种基本方法,它将一个复杂问题归结为若干个较为简单的问题,然后将这些较为简单问题进一步归结为更简单的问题,这个过程一直进行下去,直到归结为最简单的问题为止,这个最简单的问题即为递归终止条件,也称作 递归出口 。

反转链表

半腔热情 提交于 2020-02-13 02:06:33
问题: 分别用递归和非递归方式来实现反转链表。 思路1: 递归。 java代码: ListNode reverseList ( ListNode head , ListNode newHead ) { if ( head == null || head . next == null ) { newHead = head ; return head ; } ListNode pre = reverseList ( head . next , newHead ) ; pre . next = head ; head . next = null ; return head ; } 思路2: 非递归。 java代码: ListNode reverseList ( ListNode head ) { ListNode dummy = new ListNode ( 0 ) ; dummy . next = head ; if ( head == null ) return head ; ListNode curr = head . next ; head . next = null ; while ( curr != null ) { ListNode next = curr . next ; curr . next = dummy . next ; dummy . next = curr ;

Linux rmdir命令:删除空目录

久未见 提交于 2020-02-13 02:05:33
和 mkdir 命令(创建空目录)恰好相反,rmdir(remove empty directories 的缩写)命令用于删除空目录,此命令的基本格式为: [root@localhost ~]# rmdir [-p] 目录名 -p 选项用于递归删除空目录。 【例 1】 [root@localhost ~]#rmdir cangls 就这么简单,命令后面加目录名称即可,但命令执行成功与否,取决于要删除目录是否是空目录,因为 rmdir 命令只能删除空目录。 【例 2】 通过学习 mkdir 命令我们知道,使用 mkdir -p 可以实现递归建立目录,同样地,rmdir 命令可以使用 -p 选项递归删除目录。例如: [root@localhost ~]# rmdir -p lm/movie/jp/cangls 注意,此方式先删除最低一层地目录(这里先删除 cangls),然后逐层删除上级目录,删除时也需要保证各级目录是空目录。 【例 3】 rmdir 命令的作用十分有限,因为只能刪除空目录,所以一旦目录中有内容,就会报错。例如: [root@localhost # mkdir test #建立测试目录 [root@localhost ~]# touch test/boduo [root@localhost ~]# touch test/longze #在测试目录中建立两个文件

使用递归和回溯法实现迷宫问题

空扰寡人 提交于 2020-02-12 22:03:16
package recursion; /** * 迷宫采用递归做法 * * @author JustGeeker * */ public class Maze { public static void main(String[] args) { Maze maze = new Maze(); int[][] arr = maze.getMap(8, 8); maze.showMap(arr); System.out.println("==================="); maze.setWay(arr, 1, 1); maze.showMap(arr); } /** * 0 表示没走过,1表示围墙,2表示可用走通,3表示可用走过但是是死路 * * @param len数组长度 * @param wid数组宽度 * @return */ public int[][] getMap(int len, int wid) { int[][] arr = new int[len][wid]; for (int i = 0; i < len; i++) { arr[i][0] = 1; arr[i][wid - 1] = 1; } for (int i = 0; i < wid; i++) { arr[0][i] = 1; arr[len - 1][i] = 1; } arr[2][1

ProgrammerMovie

ⅰ亾dé卋堺 提交于 2020-02-12 19:48:41
电影名称Movie Name 上映年份Release Year 备注Memo(Genre/Concept) 月球 Moon 2009 克隆 Clone 环形使者 Looper 2012 循环 Loop 预见未来 Next 2007 递归 Recursion 战争游戏 WarGames 1983 后门 Back Door 云图 Cloud Atlas 2012 并行 Parallelism 源代码 Source Code 2011 重入 Reentrancy 盗梦空间 Inception 2010 递归 Recursion 恐怖游轮 Triangle 2009 死循环 Dead Loop 美丽心灵 A Beautiful Mind 2001 数学 Mathematic 攻壳机动队 Ghost in the Shell 1995 矩阵 Matrix 黑客 Hackers 1995 骇客 Evil System Admin,Hacker 互联网时代 The Internet Age 2014 记录 Documentary 土拨鼠日 Groundhog Day 1993 无限循环 Infinite Loop 骇客追缉令 Takedown 2000 计算机骇客 Computer Hacker 二维世界 Flatland 2:Sphereland 2012 二维 2-Dimension

递归算法

只愿长相守 提交于 2020-02-12 15:35:40
递归(recursion):程序调用自身的编程技巧。 递归满足2个条件: 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 递归例子: (1)阶乘 n! = n * (n-1) * (n-2) * ...* 1(n>0) //阶乘 int recursive(int i) { int sum = 0; if (0 == i) return (1); else sum = i * recursive(i-1); return sum; } (2)河内塔问题 //河内塔 void hanoi(int n,int p1,int p2,int p3) { if(1==n) cout<<“盘子从”<<p1<<“移到”<<p3<<endl; else { hanoi(n-1,p1,p3,p2); cout<<“盘子从”<<p1<<“移到”<<p3<<endl; hanoi(n-1,p2,p1,p3); } } (3)全排列 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。 如1,2,3三个元素的全排列为: 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 //全排列 inline void Swap(int &a,int &b) { int temp=a