递归算法

算法

文章目录

  • 算法
    • 1.递归算法
      • 1.1计算n以内的和
      • 1.2计算n的阶乘
      • 1.3计算斐波那契数列的第n项
      • 1.4遍历文件
    • 2升级
      • 2.1解法一
      • 2.2解法二

1.递归算法

1.1计算n以内的和

//n以内的和
    public static Integer sum(Integer num){
        if(num <0){
            return 0;
        }
        return num+sum(num-1);
    }

1.2计算n的阶乘

//n以内的阶乘
    public static Integer multiply(Integer num){
        if(num <=0){
            return 1;
        }
        return num*multiply(num-1);
    }

1.3计算斐波那契数列的第n项

//计算斐波那契数列的第n项
    public static Integer shuLie(Integer num){
        /**
         * 第n项为第n-1项与n-2项的和
         * ···
         * 第3项为第2项的与第1项的和
         * 第2项为1,第1项为1
         */
        if(num ==0 ){
            return 0;
        };
        if(num ==1){
            return 1;
        }
        return shuLie(num-1)+shuLie(num-2);
    }

1.4遍历文件

File file = new File("/3");
file(file);

//遍历查询文件
public static void file(File pfile){
    File[] files = pfile.listFiles();
    for (File file : files) {
        if(file.isDirectory()){
            file(file);
        }else{
            if(file.getName().endsWith(".md")){
                System.out.println("文件的AbsolutePath为:"+file.getAbsolutePath());
                System.out.println("文件的Path为:"+file.getPath());
            }
        }
    }
}
文件的AbsolutePath为:F:\3\MD\autoconfig.md //绝对路径
文件的Path为:\3\MD\autoconfig.md //相对于传过来的相对路径'/3'下的路径地址

2升级

实体类:

@Data
public class Demo {
    private int id;
    private int pid;
    private String name;
    private List children;
}

数据库数据:
递归算法_第1张图片
结果:

[
    {
        "id":1,
        "pid":0,
        "name":"一级节点",
        "children":[
            {
                "id":2,
                "pid":1,
                "name":"二级节点",
                "children":[
                    {
                        "id":4,
                        "pid":2,
                        "name":"三级节点",
                        "children":null
                    }
                ]
            },
            {
                "id":3,
                "pid":1,
                "name":"二级节点",
                "children":null
            }
        ]
    },
    {
        "id":5,
        "pid":0,
        "name":"一级节点",
        "children":null
    }
]

2.1解法一

参考文章

/**
 * 递归封装树形菜单
 */
public class Tree {
    List<Demo> nodes = new ArrayList<Demo>();

    public Tree(List<Demo> nodes) {
        super();
        this.nodes = nodes;
    }

    /**
     * 构建树形结构
     *
     * @return
     */
    public List<Demo> buildTree() {
        List<Demo> Demos = new ArrayList<Demo>();
        List<Demo> rootNodes = getRootNodes(); //创建一级节点
        for (Demo rootNode : rootNodes) {
            buildChildNodes(rootNode);
            Demos.add(rootNode);
        }
        return Demos;
    }

    /**
     * 递归子节点
     *
     * @param node
     */
    public void buildChildNodes(Demo node) { //node为一级节点
        List<Demo> children = getChildNodes(node); //获取一级节点下所有的子节点
        if (!children.isEmpty()) {
            for (Demo child : children) {
                buildChildNodes(child);
            }
            node.setChildren(children);
        }
    }

    /**
     * 获取父节点下所有的子节点
     *
     * @param pnode
     * @return
     */
    public List<Demo> getChildNodes(Demo pnode) {
        List<Demo> childNodes = new ArrayList<Demo>();
        for (Demo n : nodes) {
            if (pnode.getId() == n.getPid()) {
                childNodes.add(n);
            }
        }
        return childNodes;
    }

    /**
     * 判断是否为根节点
     * 查询所有父节点为0的节点
     * @return
     */
    public boolean rootNode(Demo node) {
        boolean isRootNode = true;
        for (Demo n : nodes) {
            if (node.getPid() == (n.getId())) {
                isRootNode = false;
                break;
            }
        }
        return isRootNode;
    }

    /**
     * 获取集合中所有的根节点
     *
     * @return
     */
    public List<Demo> getRootNodes() {
        List<Demo> rootNodes = new ArrayList<Demo>();
        for (Demo n : nodes) {
            if (rootNode(n)) { //根节点为false
                rootNodes.add(n);
            }
        }
        return rootNodes;
    }
}

2.2解法二

/**
 * 递归封装树形菜单
 */
public class Tree2 {

    List<Demo> nodes = new ArrayList<Demo>();

    public Tree2(List<Demo> nodes) {
        super();
        this.nodes = nodes;
    }


    public List<Demo> getlist() {
        List<Demo> mapTree = new ArrayList<>();
        for (Demo Demo : nodes) {
            if(Demo.getPid() == 0){
                mapTree.add(createTreeChildren(Demo,nodes));
            }
        }
        return mapTree;
    }

    private Demo createTreeChildren(Demo Demo, List<Demo> nodes) {

        for (Demo Demo1 : nodes) {
            if (String.valueOf(Demo1.getPid()).equals(String.valueOf(Demo.getId())) ) {
                if (Demo.getChildren() == null) {
                    Demo.setChildren(new ArrayList<>());
                }
                Demo.getChildren().add(createTreeChildren(Demo1, nodes));
            }
        }
        return Demo;
    }
}

以两种方法都是拿来即用,修改参数即可不用改太多东西

你可能感兴趣的:(算法)