标签:算法 注意 test alibaba tno cci ted turn object
1.递归算法的理解
递归算法是一种直接或间接调用自身方法的算法,递归往往可以使我们的代码大大简化,而递归的思维却跟我们正常思维相逆,通常都是自上而下的思考问题,而递归是自下而上。
2.写递归时的注意点
1.在使用递归时,必须有一个明确的递归结束条件,称为递归出口。
2.递归方法即可有返回值也可没有。
3.递归过程中每个方法都会产生一个栈帧存放到方法栈中,因此,如果递归出口没把握好,就会造成内存溢出。
4.在进入第二次递归之前不会执行下面的逻辑。
3.递归应用
1.Fibonacci数列
1 package recursion; 2 3 import org.junit.Test; 4 5 /** 6 * Created by 14611 on 2017/7/30. 7 */ 8 public class RecursionTest { 9 /** 10 * 测试在进入第二次递归之前是否执行下面的逻辑 11 * 结论:不会。 12 */ 13 @Test 14 public void testFibonaci() { 15 System.out.println("result= "+fibonaci(5)); 16 } 17 18 /** 19 * 1,1,2,3,5,8...Fibonaci数列 20 * 21 * @param n 22 * @return 23 */ 24 public int fibonaci(int n) { 25 if (n <= 2) { 26 return 1; 27 } else { 28 int value = fibonaci(n - 1) + fibonaci(n - 2); 29 System.out.println("Hello!" + n); 30 return value; 31 } 32 } 33 }
2.构造树(递归报文或JSONObject)
package tree;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
* Created by 14611 on 2017/7/30.
* 树节点
*/
public class TreeNode {
//节点id
int nodeId;
//父节点id
Integer parentId;
//节点信息
JSONObject nodeJson;
//所有子节点
List<TreeNode> subTreeNodes = new ArrayList<TreeNode>();
public void setNodeId(int nodeId) {
this.nodeId = nodeId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public void setNodeJson(JSONObject nodeJson) {
this.nodeJson = nodeJson;
}
public int getNodeId() {
return nodeId;
}
public Integer getParentId() {
return parentId;
}
public JSONObject getNodeJson() {
return nodeJson;
}
public List<TreeNode> getSubTreeNodes() {
return subTreeNodes;
}
/**
* 添加子节点
*
* @param treeNode
*/
public void addSubNode(TreeNode treeNode) {
this.subTreeNodes.add(treeNode);
}
}
package tree;
import java.util.List;
import java.util.Map;
/**
* Created by 14611 on 2017/7/30.
* 树
*/
public class Tree {
//所有树节点
Map<Integer, TreeNode> allTreeNodeMap;
/**
* 根据树的根节点构造树
*
* @param rootNode
*/
public Tree(TreeNode rootNode) {
initTree(rootNode);
}
/**
* 根据树节点递归初始化tree
*
* @param rootNode
*/
private void initTree(TreeNode rootNode) {
allTreeNodeMap.put(rootNode.getNodeId(), rootNode);
List<TreeNode> subTreeNodes = rootNode.getSubTreeNodes();
if (!subTreeNodes.isEmpty()) {
for (TreeNode subTreeNode : subTreeNodes) {
initTree(subTreeNode);
}
}
}
}
package tree;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* Created by 14611 on 2017/7/30.
* 用于管理树和树节点
*/
public class TreeManager {
Tree tree;
//指明JSON中按那个节点递归
String rootName;
String subName;
public TreeManager(JSONObject recursJson, String rootName, String subName) {
this.rootName = rootName;
this.subName = subName;
//根节点
TreeNode rootNode = getNode(recursJson);
rootNode.setParentId(null);
JSONArray subArray = recursJson.getJSONArray(subName);
//构造树
conTree(rootNode, subArray);
this.tree = new Tree(rootNode);
}
/**
* 实际上是构造根节点
* @param rootNode
* @param subArray
*/
private void conTree(TreeNode rootNode, JSONArray subArray) {
if (subArray == null) {
return;
}
for (int i = 0; i < subArray.size(); i++) {
JSONObject jsonObject = subArray.getJSONObject(i);
TreeNode node = getNode(jsonObject);
node.setParentId(rootNode.getNodeId());
rootNode.addSubNode(node);
JSONArray sub = jsonObject.getJSONArray(subName);
conTree(node, sub);
}
}
/**
* 根据递归的json得到当前树节点
*
* @param recursJson
* @return
*/
private TreeNode getNode(JSONObject recursJson) {
String root = recursJson.getString(rootName);
int id = root.hashCode();
TreeNode treeNode = new TreeNode();
treeNode.setNodeId(id);
treeNode.setNodeJson(recursJson);
return treeNode;
}
}
标签:算法 注意 test alibaba tno cci ted turn object
原文地址:http://www.cnblogs.com/sjp007/p/7258663.html