努努力力 2021-05-02 09: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 变量的值,如果放在循环外面,每次处理的值就不一样了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    努努力力 2021-05-02 09:19

    好的

    回复
    努努力力 2021-05-02 09:40

    哇,突然顿悟了,原来是这么简单的问题,我之前没有往 routeLineTemp 这个变量值来想问题,都是往 routeLine 这个变量想问题。非常感谢赖老师

    回复
    CSDN专家-赖老师(软件之家) 回复 努努力力 2021-05-02 10:39

    请采纳,谢谢!

    回复
查看更多回答(2条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 为什么树莓派5b显示禁止连接
  • ¥15 请专家处理报错!基于深度学习的车型分类问题:数据集为包含 10 种车型的图像数据集,分为训练集、验证集和测试集。
  • ¥20 流量太费!寻找便宜的app音视频SDK或平替方案。
  • ¥15 kubeasz部署遇到问题
  • ¥15 GUIDE to App Designer Migration Tool for MATLAB
  • ¥50 第三代非支配排序遗传算法(NSGA-Ⅲ)和多目标粒子群优化算法(MOPSO)的实现
  • ¥20 plant simulation与python com接口实时数据交互
  • ¥15 有关汽车的MC9S12XS128单片机实验
  • ¥15 求c语言动态链表相关课程有偿,或能将这块知识点讲明白
  • ¥15 FLKT界面刷新异常
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部