微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有递归的 Java 调用堆栈如何取回最后一个对象?

如何解决带有递归的 Java 调用堆栈如何取回最后一个对象?

我想制作一个模拟器,您可以在其中进入房间然后离开房间。如果你离开,你在进入之前就在房间里。我想用递归和调用堆栈来做到这一点。如果我进入一个新房间效果很好,但我不能回去。对此有任何解决方案吗?

import java.util.Scanner;

public class Hausaufgabe10Aufgabe01 {

    public static void main(String[] args) {
        Room workingroom = new Room("Arbeitszimmer",false);
        Room bedroom = new Room("Schlafzimmer",false);
        Kitchen kitchen = new Kitchen("Kueche",false,false);
        Bathroom bathroom = new Bathroom("Badezimmer",false);
        Room hall = new Room("Flur",false);
        hall.setNeighborRooms(bathroom,kitchen,bedroom,workingroom);
        workingroom.setNeighborRooms(bedroom);
        bedroom.setNeighborRooms(workingroom);
        Flat myFlat = new Flat(bathroom,workingroom,hall);
        boolean inFlat = false;
        Scanner input = new Scanner(system.in);
        walkThrough(myFlat,hall,input);
    }

    public static void walkThrough(Flat myFlat,Room myRoom,Scanner input) {
        while (true) {

            System.out.println("\nSie sind im: " + myRoom.getName());
            System.out.println("Was wollen sie tun ? ");

            System.out.println("1) Lichtsschalter bestätigen ? ");
            System.out.println("2) Raum verlassen? ");
            System.out.println("3) Nachbar Raum betreten ? ");

            int intMax = 3;
            if (myRoom.getName().equals("Kueche")) {
                System.out.println("4) Herd betätigen ? ");
                intMax = 4;
            }
            if (myRoom.getName().equals("Badezimmer")) {
                System.out.println("4) Dusche betätigen ? ");
                intMax = 4;
            }

            
            boolean shouldIReturn = false;
            int choosenNumber = input.nextInt();
            switch (choosenNumber) {

            case 1:
                myRoom.useLight();
                break;
            case 2:
                shouldIReturn = true;
                break;
            case 3:
                if (myRoom.getNeighborRooms() != null) {
                    myRoom = chooseRoom(input,myRoom);
                    walkThrough(myFlat,myRoom,input);
                } else {
                    System.out.println("Keine Nachbarraum vorhanden");
                }
                break;
            case 4:
                if (intMax == 4) {
                    myRoom.useSpecial();
                }
                break;
            default:
                System.out.println("\nGeben sie eine richtige Eingabe ein!!");
                if(intMax < 4) {
                    System.out.println("1 - 3 \n");
                } else {
                    System.out.println("1 - 4 \n");
                }
                break;
            }
            
            if (shouldIReturn) {
                return;
            }
        }
    }

    public static Room chooseRoom(Scanner input,Room myRoom) {
        if (myRoom.getNeighborRooms().length > 0) {
            for (int i = 0; i < myRoom.getNeighborRooms().length; ++i) {
                System.out.println((i + 1) + ") "
                        + myRoom.getNeighborRooms()[i].getName());
            }
            int choosenRoom = input.nextInt() - 1;
            return myRoom.getNeighborRooms()[choosenRoom];
        }
        return myRoom.getNeighborRooms()[0];
    }
}

我试图返回所以我结束了当前函数并返回到之前的函数,但是我没有得到我之前所在房间的名称。我怎样才能得到我以前的对象?

解决方法

myRoom 设为 final,看看你得到了什么编译时错误。

想想之前发生的事情,你就会明白为什么在打印 System.out.println("\nSie sind im: " + myRoom.getName()); 时没有得到原来的房间名称。

myRoom = chooseRoom(input,myRoom); 行中,您将 myRoom 设置为新值。因此,当您从 chooseRoom 返回时,您没有旧值。

,

我的错是我在这里覆盖了旧的引用:

case 3:
                if (myRoom.getNeighborRooms() != null) {
                    Room newRoom = chooseRoom(input,myRoom);
                    walkThrough(myFlat,newRoom,input);
                } else {
                    System.out.println("Keine Nachbarraum vorhanden");
                }
                break;

我需要为递归创建一个新变量,如果我不这样做,它会覆盖旧的

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。