递归操作,非常晦涩难懂。
递归说白了就两步,逆向去思考,设计一个跳出递归的条件,在函数内部调用自身的函数(函数的变量一定要是变化的,不然会陷入无限递归导致栈溢出),层层递进,将问题规模不断地缩小。
递归简单操作之阶乘
public int jiecheng(int n){
if(n==1){
//设计跳出条件
return 1;
}
else {
return n*jiecheng(n-1);
//在函数内部调用自身函数,并可以将问题层层递进
}
}
双重递归,归中归 ,第一层递归用于求得某节点的路径数,另一层递归用于遍历所有的结点,需要仔细认真的思考递归。
package 递归;
public class 二叉树最短路径 {
public class TreeNode {
/**
* 定义TreeNode
*/
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public int pathSum(TreeNode root, int targetSum) {
/**
* 递归遍历所有结点
*/
if (root == null) {
return 0;
}
int res=rootSum(root,targetSum);
res+=pathSum(root.left,targetSum);
res+=pathSum(root.right,targetSum);
return res;
}
public int rootSum(TreeNode root, int targetSum) {
/**
* 确定一个结点后的所有可能路径数
*/
int res=0;//路径数初始为零
int val=root.val;
if(root==null){
return 0;
}
if(targetSum==val){//结点值正好为目标值,路径直接+1
res++;
}
//对左子树,右子树进行遍历
res+=rootSum(root.left,targetSum-val);
res+=rootSum(root.right,targetSum-val);
return res;
}
}
通过对root.left root.right实行一个递归不断变小的改变