java递归写法技巧
- 格式:docx
- 大小:11.42 KB
- 文档页数:2
java while和递归
Java中的while循环和递归都是实现重复操作的重要手段,但它们在实现方式和应用场景上有所不同。
1. while循环:while循环是一种常见的控制流语句,它会在条件为真时重复执行一段代码。
在Java中,while循环的语法如下:
```java
while (condition) {
// code to be executed
}
```
当条件为真时,while循环会一直执行其中的代码块,直到条件不再满足为止。
while循环通常用于重复执行某些操作,直到满足某个特定条件。
2. 递归:递归是一种编程技巧,它是指一个函数直接或间接调用自身的过程。
递归函数必须有一个明确的结束条件,否则会无限递归下去,导致程序崩溃。
在Java中,递归函数的语法如下:
```java
public static void functionName() {
// code to be executed before recursive call
functionName();
// code to be executed after recursive call
}
```
递归函数通常用于解决一些需要重复分解的问题,例如阶乘、斐波那契数列等。
递归函数可以将问题分解为更小的子问题,然后通过调用自身来逐步解决这
些子问题,直到达到结束条件。
总的来说,while循环和递归都是实现重复操作的手段,但它们的实现方式和应用场景有所不同。
while循环适合用于简单的重复操作,而递归则适合用于解决需要分解为更小子问题的复杂问题。
java写递归终止条件Java作为一种面向对象的高级编程语言,广泛应用于各种场景中,其中递归函数是Java编程中常见的技术手段之一。
递归函数是指在函数中调用自身的函数,这种技术手段可以有效地解决一些堆栈类问题。
但是,在编写递归函数时,需要特别注意终止条件的设置。
本文将为您详细介绍如何在Java中写递归终止条件。
一、了解递归的特点和问题递归是指在一个函数中调用自身以达到解决问题的目的。
递归的实现是通过反复调用自身,直到满足某种条件时停止。
递归算法在实现方便、代码简单的同时也面临着如下问题:1.递归深度问题,每一层的调用都将占用堆栈空间,递归深度过大会导致堆栈溢出。
2.时间复杂度问题,有些递归算法的时间复杂度极大,运行时间长,效率低下。
二、递归函数设计的要点在编写递归函数时,必须考虑以下要点:1.需有明确的终止条件;2.问题规模不断缩小。
主要涉及到递归前提的问题范围、问题规模、运算符和函数自己这四个要素。
三、递归终止条件的编写递归终止条件是递归算法的关键,确定递归终止条件的设计,是递归算法正确性的保证。
递归终止条件应该显然,并且与递归调用的条件是互补的。
Java语言中一般有两种方式来设置递归终止条件:1.递归函数的参数变化这种方式是通过限定递归函数的参数,不断改变参数值来实现终止递归。
在每次递归调用中,函数的参数规模要减小,直到达到函数终止的条件,例如:public static int factorial(int n) {if(n==1) { // 终止条件return 1;} else {return n*factorial(n-1); // 递归调用}}在这个例子中,判断函数终止条件的语句是“if(n==1)”,如果条件成立,就返回1,从而终止递归;否则,继续计算n*factorial(n-1),同时,n的值得到了改变,问题规模得到了缩小,问题得到了解决。
2.基于循环控制的递归控制通过循环对递归进行控制,达到递归终止的目的。
java循环和递归在Java编程中,循环和递归是两种常用的控制结构,用于解决重复性的任务和处理递归问题。
循环可以用来重复执行一段代码,而递归则是通过调用自身来解决问题。
本文将介绍Java中的循环和递归的概念、用法和一些常见的应用场景。
一、循环的概念和用法循环是一种重复执行一段代码的控制结构。
在Java中,常见的循环结构有for循环、while循环和do-while循环。
1. for循环for循环是一种在已知循环次数的情况下重复执行一段代码的结构。
它的语法如下:```for (初始化表达式; 循环条件; 更新表达式) {// 循环体}```其中,初始化表达式用于初始化循环变量;循环条件是一个布尔表达式,用于判断是否继续执行循环;更新表达式用于更新循环变量的值。
for循环的执行顺序是先执行初始化表达式,然后判断循环条件,如果为真则执行循环体,然后执行更新表达式,再次判断循环条件,以此类推,直到循环条件为假时结束循环。
for循环的一个常见应用是遍历数组或集合。
例如,可以使用for循环计算数组中元素的总和:```int[] nums = {1, 2, 3, 4, 5};int sum = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];}System.out.println("数组的总和为:" + sum);```2. while循环while循环是一种在未知循环次数的情况下重复执行一段代码的结构。
它的语法如下:```while (循环条件) {// 循环体}```while循环的执行顺序是先判断循环条件,如果为真则执行循环体,然后再次判断循环条件,以此类推,直到循环条件为假时结束循环。
while循环的一个常见应用是读取用户输入,直到满足特定条件为止。
例如,可以使用while循环验证用户输入的密码是否正确:```import java.util.Scanner;Scanner scanner = new Scanner(System.in);String password = "123456";String input;do {System.out.println("请输入密码:");input = scanner.nextLine();} while (!input.equals(password));System.out.println("密码正确!");```3. do-while循环do-while循环是一种在未知循环次数的情况下重复执行一段代码的结构,与while循环的区别在于它先执行一次循环体,然后再判断循环条件。
java递归写法递归是一种重要的算法思想,它可以用来解决很多问题,例如数学中的阶乘、斐波那契数列、树的遍历等。
在Java中,递归的写法可以很简单,但是如果不小心就会出现栈溢出等问题。
本文将介绍Java中递归的写法,以及如何避免递归过程中出现的一些问题。
一、递归的概念递归是一种函数调用自身的算法思想。
它通过将一个问题分解为更小的子问题来解决问题。
递归算法的基本思路是:当问题的规模足够小时,直接求解;否则,将问题分解为规模更小的子问题,递归地解决子问题,最后将子问题的结果合并起来得到原问题的解。
递归算法有两个重要的特点:一是递归调用函数本身;二是需要有一个递归终止条件。
递归调用函数本身是为了将问题规模缩小,递归终止条件是为了避免无限递归。
二、递归的实现递归的实现需要考虑两个方面:递归调用和递归终止条件。
递归调用是指在函数中调用自身,递归终止条件是指当问题规模足够小时,直接求解。
例如,求n的阶乘可以使用递归实现。
当n等于1时,阶乘为1;否则,阶乘为n乘以(n-1)的阶乘。
代码如下:```javapublic class Factorial {public static long factorial(int n) {if (n == 1) {return 1;} else {return n * factorial(n - 1);}}}```这段代码中,递归调用在return语句中,递归终止条件是当n 等于1时,直接返回1。
三、递归的应用递归算法可以用来解决很多问题,例如数学中的阶乘、斐波那契数列、树的遍历等。
下面分别介绍这些应用。
1. 阶乘阶乘是指从1到n的所有正整数相乘的积。
例如,5的阶乘为5x4x3x2x1=120。
使用递归算法可以很容易地求出n的阶乘。
代码如下:```javapublic class Factorial {public static long factorial(int n) {if (n == 1) {return 1;} else {return n * factorial(n - 1);}}}```2. 斐波那契数列斐波那契数列是指第n个数等于前两个数之和。
java 递归方法Java是一种面向对象的编程语言,它支持递归方法。
递归方法是一种函数调用自身的技术,它在解决问题时往往比循环更为简洁和自然。
本文将会介绍Java中递归方法的定义、使用和注意事项。
一、递归方法的定义递归方法是一种函数调用自身的技术。
它解决了一些循环无法解决的问题,如求数组的全排列、求解斐波那契数列等。
递归方法的特点是:必须有一个终止条件,用来结束递归;否则,递归会无限进行下去,导致栈溢出。
二、递归方法的使用下面以一个简单的例子说明递归方法。
阶乘是指从1到n这n个正整数的乘积。
5! = 1×2×3×4×5 = 120。
递归方法可以用来计算阶乘。
public class RecursionExample {int result = factorial(5);System.out.println("5! = " + result);}public static int factorial(int n) {if(n==1) {return 1;}else {return n*factorial(n-1);}}}这段代码中,factorial(int n)方法是递归的。
当n等于1时,递归结束,返回1;否则计算n的阶乘,即n乘以n-1的阶乘。
运行结果为:5! = 120。
三、递归方法的注意事项递归方法的使用必须要注意以下几个问题。
1. 递归深度问题递归深度是指递归方法的嵌套层数。
每次调用递归方法都会在栈中分配一段空间。
如果递归深度太大,会导致栈溢出。
解决办法可以是:限制递归深度、尽量减少递归次数、使用非递归方法等。
2. 递归方法的效率问题递归方法的效率比较低,因为每次调用递归方法都需要执行相同的方法,造成了大量的重复计算。
解决办法可以是:使用备忘录技术、将递归方法转化为非递归方法等。
3. 递归方法的调试问题递归方法的调试比较困难,因为每次调用递归方法都需要保存大量的状态信息,而且调用层数可能非常多。
递归查询岗位下的所有子级岗位java递归查询岗位下的所有子级岗位的Java代码可以通过以下步骤实现:1. 创建一个岗位类(如Position类),其中包含岗位的ID、名称、上级岗位ID等信息。
2. 创建一个递归方法,该方法接收一个岗位ID作为参数,并返回该岗位及其所有子级岗位的列表。
3. 在递归方法中,首先从数据库中获取指定岗位ID对应的岗位信息。
4. 然后,通过查询数据库获取该岗位下的所有子级岗位,并将它们添加到列表中。
5. 对于每个子级岗位,递归调用该方法,并将子级岗位的ID作为参数传递给该方法。
6. 最后,将所有子级岗位的列表合并到根岗位的列表中,并返回该列表。
以下是一个简单的Java代码示例,用于递归查询岗位下的所有子级岗位:```javaimport java.util.ArrayList;import java.util.List;public class Position {private int id;private String name;private int parentId;// 其他属性...// 构造函数、Getter和Setter方法...}public class PositionService {public List<Position> getSubPositions(int positionId) {List<Position> positions = new ArrayList<>();getPositions(positionId, positions);return positions;}private void getPositions(int positionId, List<Position> positions) {// 从数据库中获取指定岗位ID对应的岗位信息Position position = getPositionById(positionId);positions.add(position);// 查询该岗位下的所有子级岗位,并将它们添加到列表中List<Position> subPositions = getSubPositionsByParentId(positionId);for (Position subPosition : subPositions) {getPositions(subPosition.getId(), positions);}}// 其他方法...}```在上面的代码中,`getSubPositions`方法接收一个岗位ID作为参数,并返回该岗位及其所有子级岗位的列表。
java 递归满足条件直接跳出整个方法(原创实用版4篇)《java 递归满足条件直接跳出整个方法》篇1在Java 中,递归方法可以通过判断条件来跳出整个方法。
这通常是通过在递归方法中使用`return` 语句来实现的。
当满足特定条件时,直接返回即可跳出递归。
以下是一个简单的递归方法示例,该方法计算阶乘(n! = n * (n-1) * (n-2) *... * 1)。
```javapublic int factorial(int n) {if (n == 0 || n == 1) {return 1;}return n * factorial(n - 1);}```在这个例子中,当`n` 等于0 或1 时,条件满足,方法直接返回1。
这意味着递归过程将在这些条件下停止,从而避免了无限递归导致的Stack Overflow。
《java 递归满足条件直接跳出整个方法》篇2在Java 中,递归方法满足条件后直接跳出整个方法,可以通过在递归方法中添加一个标志变量来实现。
这个标志变量在满足条件时被设置为true,递归方法会在下一次调用前检查这个标志变量,如果为true,则直接返回。
下面是一个简单的递归方法示例,用于计算阶乘:```javapublic class Factorial {public static void main(String[] args) {int n = 5;int result = factorial(n);System.out.println("阶乘" + n + "! = " + result);}public static int factorial(int n) {if (n == 0 || n == 1) {return 1;}int result = 1;for (int i = 2; i <= n; i++) {result *= i;}return result;}}```如果我们想在满足条件时直接跳出整个方法,可以在递归方法中添加一个标志变量,如下所示:```javapublic class Factorial {public static void main(String[] args) {int n = 5;boolean isCancelled = false;int result = factorial(n, isCancelled);if (!isCancelled) {System.out.println("阶乘" + n + "! = " + result);}}public static int factorial(int n, boolean isCancelled) {if (n == 0 || n == 1) {return 1;}int result = 1;for (int i = 2; i <= n &&!isCancelled; i++) {result *= i;}if (isCancelled) {return 0;return result;}}```在这个修改后的示例中,我们添加了一个名为`isCancelled` 的标志变量,并将其传递给递归方法。
java 递归比较对象递归在Java中是一种非常常见的编程技巧,通过递归可以实现对对象进行深度比较。
在Java中比较两个对象的内容通常使用`equals()`方法,但是对于自定义的类,需要重写`equals()`方法来实现对象内容的比较。
递归比较对象时,需要考虑对象的所有字段,包括基本类型和引用类型。
首先,对于基本类型的字段,可以直接使用`==`或者`equals()`方法进行比较。
而对于引用类型的字段,需要递归比较对象的内容。
在递归比较对象时,需要注意以下几点:1. 首先比较对象的类型是否相同,如果类型不同直接返回false。
2. 然后比较对象的每个字段,如果字段为基本类型,则直接比较;如果字段为引用类型,则递归比较对象的内容。
3. 如果对象中存在循环引用,比较时需要注意避免陷入死循环。
下面是一个简单的示例代码,演示了如何通过递归比较两个对象的内容:```javapublic class Person {private String name;private int age;private Person spouse;// 省略构造方法和其他方法@Overridepublic boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}Person other = (Person) obj;return age == other.age && Objects.equals(name, ) &&Objects.equals(spouse, other.spouse);}}```在上面的示例中,`equals()`方法通过递归比较对象的字段来判断两个`Person`对象是否相等。
需要注意的是,为了避免NPE,需要使用`Objects.equals()`方法比较引用类型的字段。
java树形递归在Java中,树形递归指的是在树形结构中递归遍历每一个节点。
通常情况下,树形递归都是通过递归函数的方式实现的。
下面是实现树形递归的一些常见方法:1.递归遍历树递归遍历树是最常见的树形递归方法。
基本思路是,先遍历根节点,然后遍历每一个子节点,并以此类推,直到遍历完整个树。
示例代码:```public void traverseTree(TreeNode root) {if (root == null) {return;}System.out.println(root.val);traverseTree(root.left);traverseTree(root.right);}```2.递归查找节点递归查找节点是指在树形结构中递归查找某一个节点。
基本思路是,先比较当前节点,如果相等则返回当前节点,否则递归查找左子树和右子树,直到找到目标节点。
示例代码:```public TreeNode searchNode(TreeNode root, int target) { if (root == null) {return null;}if (root.val == target) {return root;}TreeNode left = searchNode(root.left, target);if (left != null) {return left;}TreeNode right = searchNode(root.right, target);if (right != null) {return right;}return null;}```3.递归插入节点递归插入节点是指在树形结构中递归插入一个新的节点。
基本思路是,先比较当前节点,如果要插入的节点应该在当前节点的左子树中,则递归插入左子树,若应该在右子树中则递归插入右子树,直到找到合适的位置。
示例代码:```public TreeNode insertNode(TreeNode root, int val) {if (root == null) {return new TreeNode(val);}if (val < root.val) {root.left = insertNode(root.left, val);} else {root.right = insertNode(root.right, val);}return root;}```总结以上是实现树形递归的三种常见方法,它们共同具有的特点是都是采用递归函数的方式进行实现。
java 树形结构递归实现在编程中,树形结构是一种非常常见的数据结构,它由节点和边组成,可以用于表示层次化的数据关系。
在 Java 中,我们可以通过递归来实现树形结构的数据操作。
接下来,我们将逐步介绍如何使用Java 递归来实现树形结构。
1. 定义树的节点类首先,我们需要定义树形结构的节点类。
一个节点类通常包含一个值以及左右子节点。
它的定义如下:```javapublic class TreeNode {int value;TreeNode left;TreeNode right;public TreeNode(int value) {this.value = value;left = null;right = null;}}```2. 插入节点接下来,我们需要实现向树中插入节点的方法。
算法思路是,从根节点开始比较,如果值比当前节点小,在其左子树中查找,否则在右子树中查找。
直到找到一个空位,将新节点插入进去。
实现代码如下:```javapublic void insert(TreeNode root, int value) {if (value < root.value) {if (root.left == null) {root.left = new TreeNode(value);} else {insert(root.left, value);}} else {if (root.right == null) {root.right = new TreeNode(value);} else {insert(root.right, value);}}}```3. 遍历树我们可以使用三种遍历方法来遍历树的节点:先序遍历(preorder):根节点 -> 左子树 -> 右子树中序遍历(inorder):左子树 -> 根节点 -> 右子树后序遍历(postorder):左子树 -> 右子树 -> 根节点以下是先序遍历代码的实现:```javapublic void preorder(TreeNode root) {if (root != null) {System.out.print(root.value + " ");preorder(root.left);preorder(root.right);}}```中序遍历和后序遍历的代码实现也非常类似,读者可以自行尝试实现。
Java算法-递归算法Java 算法 - 递归算法⽬录递归本质是借助栈的数据结构,加上⼀个简单的逻辑算法实现。
递归是⼀种应⽤⾮常⼴泛的算法,很多数据结构和算法都要⽤到递归,⽐如 DFS 深度优先搜索、前中后序⼆叉树遍历等等。
所以,搞懂递归⾮常重要,否则,后⾯复杂⼀些的数据结构和算法学起来就会⽐较吃⼒。
我们以斐波那契数列分析⼀下递归算法。
# 斐波那契数列:后⼀个数等于前两个数之和1 123 5 8 13 21 34 ...1. 如何编写递归1.1 递归的条件究竟什么样的问题可以⽤递归来解决呢?只要同时满⾜以下三个条件,就可以⽤递归来解决:1. ⼀个问题的解可以分解为⼏个⼦问题的解,这些分解后的⼦问题,除了数据规模不同,求解思路完全⼀样。
何为⼦问题?⼦问题就是数据规模更⼩的问题。
在斐波那契数列中,就是求出前两个数之和。
2. 根据分解后的⼦问题,写出递归公式。
在斐波那契数列中,就是 f(n) = f(n -1) + f(n -2)。
3. 存在递归终⽌条件。
把问题分解为⼦问题,把⼦问题再分解为⼦⼦问题,⼀层⼀层分解下去,不能存在⽆限循环,这就需要有终⽌条件。
在斐波那契数列中,存在多个终⽌条件,也就是 f(1) = 1 和 f(2) = 1,这就是递归的终⽌条件。
1.2 如何编写递归代码写递归代码的关键就是找到如何将⼤问题分解为⼩问题的规律,并且基于此写出递推公式,然后再推敲终⽌条件,最后将递推公式和如何将⼤问题分解为⼩问题的规律,并且基于此写出递推公式,然后再推敲终⽌条件,最后将递推公式和终⽌条件翻译成代码。
只要遇到递归,我们就把它抽象成⼀个递推公式,不⽤想⼀层层的调⽤关系,不要试图⽤⼈脑去分解递归的每个步终⽌条件翻译成代码。
骤。
public int fibonacci(int n) {if (n == 1 || n == 2) {return 1;}return fibonacci(n - 1) + fibonacci(n - 2);}2. 总结2.1 注意事项(1)警惕堆栈溢出编写递归代码时,如果递归层次太深,会出现堆栈溢出。
java list 递归分组合计 -回复Java List递归分组合计在Java中,List是一个非常常用的数据结构,它可以用来存储一组数据,并提供一系列的方法来对数据进行操作。
在实际开发中,我们经常会遇到需要对List中的元素进行分组合计的需求。
在本文中,我将详细介绍如何使用递归算法来实现List的分组合计,并提供一步一步的操作指南。
第一步:准备工作在开始之前,我们需要先做一些准备工作。
首先,我们需要有一个包含数据的List对象。
假设我们有一个名为d a t a L i s t的L i s t对象,它包含了一些整数数据。
我们可以使用如下的代码来创建并初始化这个List对象:List<Integer> dataList = newArrayList<>();dataList.add(1);dataList.add(2);dataList.add(3);dataList.add(4);dataList.add(5);除了数据List之外,我们还需要定义一个用来存储分组合计结果的数据结构。
在本示例中,我们使用一个名为groupedResult的Map对象来存储分组合计的结果。
其中,Map的键表示分组的标识,而值表示该分组的合计结果。
Map<String, Integer> groupedResult = new HashMap<>();第二步:编写递归方法接下来,我们需要编写一个递归方法来完成分组合计的操作。
这个递归方法将会接收两个参数:一个是当前的数据List,另一个是分组合计结果的Map对象。
递归方法的基本逻辑如下:- 如果数据List为空,说明已经没有需要处理的数据了,直接返回;- 否则,取出数据List的第一个元素;- 根据元素的值来确定其所属的分组;- 将元素的值添加到分组的合计结果上,如果分组不存在,则创建一个新的分组;- 从数据List中删除已处理的元素;- 递归调用自身,继续处理剩余的数据。
Java实现简单的递归操作⽅法实例前⾔在数据结构算法设计中,或者⼀个⽅法的具体实现的时候,有⼀种⽅法叫做“递归”,这种⽅法在思想上并不是特别难,但是实现起来还是有⼀些需要注意的。
虽然对于很多递归算法都可以由相应的循环迭代来代替,但是对于⼀些⽐较抽象复杂的算法不⽤递归很难理解与实现。
递归分为直接递归和间接递归,就简单分享⼀下两个⼩的直接递归。
对于递归的概念,其实你可以简单的理解为⾃⼰定义⾃⼰,记得⼩时候看过⼀部电视剧《狼毒花》,⾥⾯主⾓叫做“常发”,但是个⽂盲,⽼师问他叫什么,他说“常发”。
“哪个常?”“常发的常啊!”“哪个发?”“常发的发啊!”结果第⼆节课⽼师就让⼀群⼩朋友⼀起喊“常发的常,常发的发,傻⽠的傻,傻⽠的⽠”。
⾔归正传,显然在多数情况下递归是解释⼀个想法或者定义的⼀种合理⽅法。
在思想上递归类似于数学中曾经学过的数学归纳法。
递归的实现:递归的实现要注意有两点:⼀个递归的选项和⼀个⾮递归的选项,后者成为基础情形(base case)。
基础情形是递归的终结情形,没有基础情形或者处理不好都会导致⽆穷递归,这是我们不想要的结果。
递归实现起来最关键的是处理好基础情形。
结合具体事例在说⼀下递归回溯的过程。
下边来写两个⼩程序:1、爬楼梯算法:已知⼀个楼梯有n个台阶,每次可以选择迈上⼀个或者两个台阶,求⾛完⼀共有多少种不同的⾛法。
⽅法如下:递归函数有返回值的⽐没有返回值的⿇烦⼀点,因为⼀个函数只有⼀个返回值,但是递归还要求有基础情形的存在,所以还必须有if判断来终⽌递归。
所以在每⼀个if或者else后边都有⼀个return,这样保证函数在任何⼀种情况下都有且仅有⼀个返回值。
分析⼀下这个算法:A:如果有0个台阶,那么有0种⾛法,这个不⽤多说;B:如果有1个台阶,那么有1种⾛法;C:如果有2个台阶,那么有2种⾛法(⼀次⾛1个,⾛两次;⼀次⾛两个);以上的B和C就是基础情形。
D:接下来就是递归了,如果台阶数⽬多于2个,那么⾸先第⼀步就有两种选择:第⼀次⾛1个,或者第⼀次⾛两个。
Java简单递归算法(两种例⼦)例⼦⼀:程序结束⼝:表达式(n==-1)为true,代表n(100)被递减完了,已经不能被递减了,如不是-1,则代表还有数值可以被递减,此题及计算结果为偶数总和,递减时应当判断当前n是否为偶数如果是偶数,则 sum(偶数总和) = n(当前数值)+ 调⽤此⽅法(n(当前数值)-1(每次递减1))如果不是偶数,则不需要添加到sum ⾥⾯,直接再次调⽤⾃⼰本⾝⽅法,n-1,进⼊下⼀轮/*** 计算1-100以内偶数的总和* n为要计算的数值(100)* sum为总和*/public static int evenSum(int n) {int sum = 0;if (n == -1) {return sum;} else {if (n % 2 == 0) {return sum =n+evenSum(n - 1);} else {return evenSum(n - 1);}}}/*** 计算1-100以内的和* n为要计算的数值(100)* sum为总和*/public static int totalSum(int n){int sum=0;if (n==-1){return sum;}else {return sum=+n+totalSum(n-1);}}public static void main(String[] args) {//计算1-100以内偶数的和System.out.println(totalSum(100));//计算1-100以内的和System.out.println(evenSum(100));}。
Java基本的递归写法1.⾸先我们得有⼀个树状结构的表,类似这种结构。
必须得有 id,pid 其他的根据需要来。
我们叫它treeTbl表吧。
这⾥pid为0的表⽰是顶级节点。
2.接着select * from treeTbl ,并将得到的list 转换成⼀个Map集合,key 为 pid ,value 为⼦元素对象集合或者⼦元素id集合之类的都可以,根据需要。
我这⾥只需要id,所以是定义为了List<string>类型。
Map<String,List<String>> map=new HashMap<String,List<String>>();for(Object[] obj : list){String id=obj[0].toString();String pid=obj[1].toString();if(map!=null && map.get(pid)!=null){map.get(pid).add(dic_id);}else{List<String> list_tmp=new ArrayList<String>();list_tmp.add(id);map.put(pid,list_tmp);}}3.递归遍历,说明在注释中//最终得到的⼦孙集合List<String> idList=new ArrayList<String>();/*这个pid的值根据需要来,如果要获取整棵树,这⾥就填根节点的id,treeTbl表中的根节点的 id 为 0如果是获取指定⽗级节点下的所有⼦孙节点,就填该⽗节点的 id 值*/List<String> chidrenList=map.get(pid);/*上⾯得到的chidrenList仅仅是底下⼀层的节点集合,也就是说只包含了⼦节点,未包含⼦节点下的所有⼦孙节点如果变量pid表⽰第⼀层的话,这⾥我们从第⼆层开始递归也就是不停的寻找下⼀层下⼀层下⼀层……直到不存在下⼀层为⽌如何判断有⽆下⼀层呢,之前创建好的HashMap已存好⽗⼦关系,⽤它来判断就好*/for(String id : childrenList){//⽤于递归的⽅法,只有把 id 下的所有⼦孙节点全部存⼊idList,才会进⾏下⼀轮循环getChildrens(map, id ,idList);}//将之前第⼀层⼦节点也加⼊进来(这个地⽅根据需要来)idList.addAll(chidrenList);private void getChildrens(Map<String,List<String>> map,String id,List<String> idList) {//查询当前id下的⼦级的集合List<String> list=map.get(id);//如果list不为空,则表⽰该id下还有⼦id,重新调⽤当前⽅法进⾏递归查询if(list!=null && list.size()>0){for(String id2 : list){//存⼊集合idList.add(id2);//再查⼀次getChildrens(map, id2, idList);}}}。
java递归累加Java递归累加是指在Java编程中,使用递归的方式实现累加操作。
递归是一种重要的编程技巧,通过在方法内部调用自身,可以解决一些复杂的问题。
在Java中,实现递归累加操作需要满足两个条件:基线条件和递归条件。
基线条件是递归的终止条件,当满足该条件时,递归操作将停止。
递归条件是指在递归操作中,需要对输入进行处理并调用自身的条件。
下面我们以一个简单的例子来说明Java递归累加的实现过程。
假设我们需要计算从1累加到n的和,可以使用递归的方式实现。
我们定义一个递归方法sum,该方法接收一个整数n作为参数,并返回从1累加到n的和。
在方法内部,我们需要判断基线条件和递归条件。
基线条件是当n等于1时,直接返回1。
这是因为当n等于1时,无需进行累加操作,直接返回1即可。
递归条件是当n大于1时,调用sum方法对n-1进行累加,并将结果与n相加。
即sum(n) = n + sum(n-1)。
下面是使用Java代码实现递归累加的示例:```javapublic class RecursionExample {public static int sum(int n) {if (n == 1) {return 1;} else {return n + sum(n - 1);}}public static void main(String[] args) {int result = sum(5);System.out.println("从1累加到5的和为:" + result); }}```在上述代码中,我们调用sum方法对整数5进行累加操作,最终得到的结果为15。
这是因为sum(5) = 5 + sum(4),sum(4) = 4 + sum(3),以此类推,最终得到sum(1) = 1。
将这些结果相加即可得到从1累加到5的和。
需要注意的是,在使用递归时,一定要确保存在基线条件,否则递归操作将无法停止,导致栈溢出的错误。
java递归写法技巧
递归是一种在编程中经常使用的技巧,特别是在解决可以分解为相似子问题的问题时。
以下是一些Java递归写法的技巧:
1. 明确递归的终止条件:在递归方法中,必须有一个基本情况,即递归的停止条件。
否则,递归将无限进行下去,最终导致栈溢出。
```java
public int factorial(int n) {
// 终止条件
if (n == 0 || n == 1) {
return 1;
}
// 递归调用
return n * factorial(n - 1);
}
```
2. 将问题分解为子问题:将大问题分解为小问题,然后通过递归解决小问题。
确保每个递归调用都在解决一个规模更小的问题。
```java
public int sum(int[] array, int n) {
// 终止条件
if (n == 0) {
return 0;
}
// 递归调用,将问题分解为子问题
return array[n - 1] + sum(array, n - 1);
}
```
3. 避免重复计算:在递归中可能会遇到重复计算相同的子问题,可以使用记忆化技术或动态规划来避免这种情况。
```java
private Map<Integer, Integer> memo = new HashMap<>();
public int fib(int n) {
if (n <= 1) {
return n;
}
// 检查是否已经计算过
if (memo.containsKey(n)) {
return memo.get(n);
}
// 递归调用,将问题分解为子问题
int result = fib(n - 1) + fib(n - 2);
// 将结果保存到缓存中
memo.put(n, result);
return result;
}
```
4. 注意栈溢出:在处理大规模问题时,可能会导致栈溢出。
可以考虑使用尾递归优化(在Java中通常不会被自动优化)或迭代来避免这种情况。
这些技巧可以帮助你更好地编写递归代码。
请注意,递归可能会导致性能问题,因此在某些情况下,迭代可能是更好的选择。