努努力力 2021-05-02 17:11 采纳率: 100%
浏览 37
已采纳

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) {} 循环体外,得到错误的结果

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

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

 

 

  • 写回答

3条回答 默认 最新

  • 关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常
  • ¥15 SCENIC分析报错求解答