努努力力 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条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。