一.含义
递归,就是在运行的过程中调用自己。
二.模板及条件
public void function(参数0) {
if (终止条件) {
return;
}
function(参数1);
}
ps:1.注意终止条件要放调用之前,不然会报StackOverflowError。
2.递归是把一个大的问题细分为更小的子问题,是一个重复的过程,只需要知道递归函数的功能即可,不要把递归一层一层的拆开来想。
三.举例
1)汉诺塔
汉诺塔的原理就是借助一个柱子把盘子移动另一个柱子上面,所以程序分三步:
1,先把n-1个圆盘从A借助C成功的移动到B
2,然后再把第n个圆盘从A移动到C
3,最后再把n-1个圆盘从B借助A成功的移动到C。
//伪代码
1,hanoi(n-1, 'A', 'C', 'B')//借助B把A上的盘子移动到C
2,System.out.println("从" + A + "移动到" + C);
3,hanoi(n-1, 'B', 'A', 'C')
要清除各个参数的含义
(2)
(2)430. 扁平化多级双向链表 - 力扣(LeetCode) (leetcode-cn.com)
这题简单来说核心思路就是先把子指针全部接上去,再接next指针,用了两层递归。
/*
// Definition for a Node.
class Node {
public int val;
public Node prev;
public Node next;
public Node child;
};
*/
class Solution {
Node p = new Node(0);
public Node flatten(Node head) {
dfs(head);
if(head != null)
head.prev = null;
return head;
}
public void dfs(Node root){
if(root == null)return;
Node left = root.child;
Node right = root.next;
p.next = root;
root.prev = p;
p = root;
dfs(left);
root.child = null;
dfs(right);
}
}
注意终止条件放再函数最前面