如何解决带有递归的 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 举报,一经查实,本站将立刻删除。