Java,写递归程序时,本人遇到了一个理解不了的问题

需求:

问题:

我用递归程序来实现该需求功能,其中遇到一个想不明白的问题,其问题还是用代码来说明吧。

 

正确的代码:

package com.org.mai;

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> routes = new ArrayList<>();
        routes.add("s-1");
        routes.add("1-2");
        routes.add("1-3");
        routes.add("2-4");
        routes.add("3-4");
        routes.add("4-e");

        ArrayList<String> lines = new ArrayList<>();
        getWfRouteLines("", routes, "", lines);
        for (String line : lines) {
            System.out.println(line);
        }
    }

    /**
     * 获取所有的路线
     * @param s 前节点
     * @param routes 存放 “前节点-后节点“ 格式值
     * @param routeLine 正在组建的路线
     * @param lineList 最终的所有路线
     */
    public static void getWfRouteLines(String s, ArrayList<String> routes, String routeLine, ArrayList<String> lineList) {
        ArrayList<String> routeTemp  = (ArrayList<String>) routes.clone();
        boolean flag = s.contains("e");
        /* 正在组建路线 */
        if (!flag) {
            for (String route : routes) {
                String routeLineTemp = routeLine;
                // 前节点
                String nodeS = route.split("-")[0];
                // 后节点
                String nodeE = route.split("-")[1];
                /* 设置初始节点 */
                if (nodeS.contains("s")) {
                    s = nodeS;
                }
                /* 筛选前节点,并组建路线 */
                if (nodeS.equals(s)) {
                    /* 首次组建路线 */
                    if (routeLineTemp.isEmpty()) {
                        routeLineTemp += nodeS + ",";
                    }
                    routeLineTemp += nodeE + ",";
                    routeTemp.remove(route);
                    getWfRouteLines(nodeE, routeTemp, routeLineTemp, lineList);
                }
            }
        }
        /* 组建的路线中,如果有结束节点,则表示已经组建一条完整的路线 */
        else {
            lineList.add(routeLine.substring(0, routeLine.length() - 1));
        }
    }
}

 输出的结果:

 s,1,2,4,e
 s,1,3,4,e

 

错误的代码:

package com.org.mai;

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> routes = new ArrayList<>();
        routes.add("s-1");
        routes.add("1-2");
        routes.add("1-3");
        routes.add("2-4");
        routes.add("3-4");
        routes.add("4-e");

        ArrayList<String> lines = new ArrayList<>();
        getWfRouteLines("", routes, "", lines);
        for (String line : lines) {
            System.out.println(line);
        }
    }

    /**
     * 获取所有的路线
     * @param s 前节点
     * @param routes 存放 “前节点-后节点“ 格式值
     * @param routeLine 正在组建的路线
     * @param lineList 最终的所有路线
     */
    public static void getWfRouteLines(String s, ArrayList<String> routes, String routeLine, ArrayList<String> lineList) {
        ArrayList<String> routeTemp  = (ArrayList<String>) routes.clone();
        boolean flag = s.contains("e");
        /* 正在组建路线 */
        if (!flag) {
            String routeLineTemp = routeLine;
            for (String route : routes) {
                // 前节点
                String nodeS = route.split("-")[0];
                // 后节点
                String nodeE = route.split("-")[1];
                /* 设置初始节点 */
                if (nodeS.contains("s")) {
                    s = nodeS;
                }
                /* 筛选前节点,并组建路线 */
                if (nodeS.equals(s)) {
                    /* 首次组建路线 */
                    if (routeLineTemp.isEmpty()) {
                        routeLineTemp += nodeS + ",";
                    }
                    routeLineTemp += nodeE + ",";
                    routeTemp.remove(route);
                    getWfRouteLines(nodeE, routeTemp, routeLineTemp, lineList);
                }
            }
        }
        /* 组建的路线中,如果有结束节点,则表示已经组建一条完整的路线 */
        else {
            lineList.add(routeLine.substring(0, routeLine.length() - 1));
        }
    }
}

输出的结果:

s,1,2,4,e
s,1,2,3,4,e 

 

想不明白问题在于 getWfRouteLines 方法中的代码 String routeLineTemp = routeLine; 的位置。

String routeLineTemp = routeLine; 放在 for (String route : routes) {} 循环体里面,能得到正确的结果

String routeLineTemp = routeLine; 放在 for (String route : routes) {} 循环体外,得到错误的结果

为什么?麻烦各位哥哥姐姐弟弟妹妹们,帮忙解答下,我实在是想不明白了@_@,谢谢啦。

(我是用递归的思路来实现该需求功能,如果大家还有其他好的思路,可以分享下,如果想分享的话。)

 

 

在循环内部你有修改routeLineTemp 变量的值,如果放在循环外面,每次处理的值就不一样了。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y