递归

八皇后问题递归Java实现

冷暖自知 提交于 2020-02-27 18:41:07
八皇后问题递归java实现 八皇后问题是指将八个皇后放置在8*8的国际棋盘上,使其两两之间不处于同一行同一列和同一斜线上。 递归解体思路为: 首先n=0,i=0,代表初始在第0行第0列放置第1个皇后 如果n=8,则八个皇后已经放完,输出当前的结果,并返回 在第 n 行第 i 列放置第 n+1 个皇后(同一个n) 判断该皇后是否与之前的所有皇后冲突,若冲突则列数 i + 1 重复进行第4步,若不冲突则n+1,重复进行第二步 存在问题:使用递归,算法效率低 具体实现代码如下: public class EightQueens { /* * arr[n]=i 表示第i个皇后放在棋盘的第n行,第i列 * max代表皇后的个数8 * times记录解法个数 * */ static int [ ] arr = new int [ 8 ] ; static int max = 8 ; static int times = 0 ; public static void main ( String [ ] args ) { check ( 0 ) ; } /* * check递归进行皇后的放置参数n代表放置第n个皇后 */ private static void check ( int n ) { //因为索引从0开始,所以n==max时表示八个皇后都放置完成,次数加一并打印当前的结果 if ( n

Java中递归和迭代

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-27 15:42:32
关于递归调用,我还是在网上找的相关知识点。所谓递归,就是程序调用自身的编程技巧,一个过程或函数在其定义或说明中有直接或间接调。 通过例子来实现: public class factorial { public static void main(String[] args) { System.out.println(f(6)); } public static long f(int n) { if(n==1) { return 1; }else { return n*f(n-1); } } } 迭代:简而言之,就是A不停的调用B。通过另一个例子实现: public class iteration { public static void main(String[] args) { System.out.println(f(20)); } public static long f(int index) { if(index==1||index==2) { return 1l; } long f1=1l; long f2=1l; long f=0; for(int i=0;i<index;i++) { f=f1+f2; f1=f2; f2=f; } return f; } } 来源: oschina 链接: https://my.oschina.net/u/4455988/blog

图文了解RNN与LSTM(详细)

坚强是说给别人听的谎言 提交于 2020-02-27 13:20:47
递归神经网络是最先进的顺序数据算法之一,在苹果Siri和Google语音搜索中都使用到的算法。这是因为它是第一个记忆它的输入的算法,由于内部存储器,这使得它非常适合涉及顺序数据的机器学习问题。它是过去几年Deep Learning的惊人成就背后的算法之一。在这篇文章中,你将学习递归神经网络如何工作的基本概念,最大的问题是什么以及如何解决它们。 介绍 递归神经网络(RNN)是一种功能强大的神经网络类型,属于目前最有前途的算法,因为它们是唯一具有内部存储器的算法。 与许多其他深度学习算法一样,RNN也相对较旧。它们最初是在20世纪80年代创建的,但是由于可用计算能力的增加,现在我们拥有的大量数据以及20世纪90年代的LSTM的发明,这些数据的真正潜力逐渐发挥出来。 由于内部记忆,RNN能够记住他们收到的输入的重要信息,这使得他们能够非常精确地预测接下来会发生什么。 这就是为什么它们是像时间序列、语音、文本、财务数据、音频、视频、天气等时序数据的首选算法,因为它们可以形成对序列及其上下文的深入理解的算法。 递归神经网络在连续数据中产生预测结果,而其他算法则不能。 但是,你何时需要使用循环神经网络? “每当有数据序列时,连接数据的时间动态都比每个帧的空间内容更重要。”- Lex弗里德曼(麻省理工学院) 由于它们正在苹果和谷歌翻译的Siri软件中使用,神经网络正在各地出现。 他们如何工作?

二叉树和递归

人盡茶涼 提交于 2020-02-27 13:16:53
二叉树和递归 递归结构中必须包含两个部分,一个是 递归终止条件 ,一个是 递归过程 。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public : int maxDepth ( TreeNode * root ) { int count = 0 ; if ( !root ) return count ; if ( ( root - > left == NULL ) && ( root - > right == NULL ) && root ) return 1 ; return max ( maxDepth ( root - > left ) + 1 , maxDepth ( root - > right ) + 1 ) ; } } ; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;

递归打印多级目录

Deadly 提交于 2020-02-27 13:11:49
话不多说,直接上代码: import java.io.File; public class demo2PrintDir { public static void main(String[] args) { String s = new String("E:\\demo"); printAllFiles(s); } public static void printAllFiles(String pathname){ File file = new File(pathname);//创建File File[] files = file.listFiles();//把当前File对象下所有的文件夹或目录 for (File file1: files){ if (file1.isFile()){//递归的终止条件是:当前File为文件 System.out.println(file1.getAbsolutePath()); } else{//当前File为目录,则,打印当前File的子文件的递归目录 //String s = file1.getPath(); //printAllFiles(s); //printAllFiles(file1.getPath()); System.out.println(file1.getAbsolutePath()); printAllFiles

oracle中 connect by prior 递归算法

北慕城南 提交于 2020-02-27 10:35:36
有时候在界面常可以看到一种树形结构的案例:   那么在数据库中是怎么设计的呢?   给一个案例:      create table Employee ( parent_id int,--这个作为关联本身的父类节点 child_id int, name varchar2(20) ) insert into employee values(1,2,'第2个'); insert into employee values(1,3,'第3个'); insert into employee values(2,4,'第4个'); insert into employee values(2,5,'第5个'); insert into employee values(3,6,'第6个'); insert into employee values(3,7,'第7个'); insert into employee values(4,8,'第8个'); insert into employee values(4,9,'第9个'); insert into employee values(5,10,'第10个'); insert into employee values(5,11,'第11个'); insert into employee values(8,12,'第12个'); insert into

递归拼装无限层级菜单树

馋奶兔 提交于 2020-02-27 01:42:36
public List < menu > getMenuTree ( ) {      List < menu > list = menuService . findAll ( ) ; List < menu > baseLists = new ArrayList < > ( ) ; List < menu > result = new ArrayList < > ( ) ; // 总菜单,查出一级菜单,一级菜单没有父id(判断条件可以改为pid为0) for ( menu e : list ) { if ( e . getPid ( ) == null ) { baseLists . add ( e ) ; } } // 遍历一级菜单 for ( menu e : baseLists ) { // 将子菜单放进进一级菜单里面 e . setChilds ( getChild ( e . getId ( ) , list ) ) ; result . add ( e ) ; }      return result ; } // 获取子级菜单 private List < menu > getChild ( String pid , List < menu > menus ) { List < menu > childs = new ArrayList < > ( ) ; for

python学习笔记三

倾然丶 夕夏残阳落幕 提交于 2020-02-26 20:14:47
  函数:   __doc__:显示函数文档:也可使用help()      函数中无法直接修改全局变量,需要对变量定义为global:      global适用于函数内部修改全局变量的值   nonlocal适用于嵌套函数中内部函数修改外部变量的值      使用MyFunction1 时返回的是MyFunction1 这个函数;   使用MyFunction1() 时返回的是MyFunction1 () 执行后的返回值,如果MyFunction1 ()函数没有返回值则返回值为None,      lambda匿名函数:使用过后被清除,没有名字       fileter()函数: 用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。   最终得出结果为true的新列表:       递归算法:    递归算法求阶乘: 1 ###递归函数求阶乘 2 def jiecheng(number): 3 if(number == 1): 4 return 1 5 else: 6 return number*jiecheng(number-1) 7 number = int(input('请输入一个正整数:')) 8 print(number,'的阶乘为:',jiecheng(number)) 递归求阶乘   结果:      

并查集

耗尽温柔 提交于 2020-02-26 19:29:28
并查集 :(union-find sets) 是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskal算法求最小生成树。 并查集的精髓: 1、make_set(x) 把每一个元素初始化为一个集合 初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。 2、find_set(x) 查找一个元素所在的集合(有两种方法:朴素查找和采用路径压缩的方法查找,其中路径压缩有递归和非递归) 查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。 3、Union(x,y) 合并x,y所在的两个集合: 利用Find_Set找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。 并查集的优化 1、find_set(x)时 路径压缩 寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次find_set(x)都是O(n)的复杂度,因此需要路径压缩,即当我们经过"递推"找到祖先节点后,"回溯"的时候顺便将它的子孙节点都直接指向祖先,这样以后再次find_set(x)时复杂度就变成O(1)了,路径压缩方便了以后的查找。 2、Union(x,y

数据结构--绪论

故事扮演 提交于 2020-02-26 16:38:10
数组求和的迭代和递归求法 迭代版本 int SUMI(int A[], int n) { int sum = 0; //O(1) for (int i = 0;i < n;i++) { //n sum += A[i]; // O(1) } return sum; // O(1) } 递归版本 int SUM2(int A[], int n) { //线性递归,采取递归跟踪的策略 return //也可以采取递归方程 (n < 1) ? 0 : SUM2(int A[], int n - 1) + A[n - 1]; } //T( ) = O(1) * (N+1) = O(n) 数组倒置递归版本 void reverse(int* A, int lo, int hi) { //数组倒置递归版本 if (lo < hi) { swap(A[lo], A[hi]); return reverse( A, int lo + 1, int hi - 1); } else return; // 这个就是递归基啊,lo >= hi 都不行的。 } 分而治之版数组求和 int SUM(int A[], int lo, int hi) { //分治版数组求和 if (lo == hi)return A[lo]; int mid = (lo + hi) >> 1; return SUM(A, lo,