Java 递归迷宫程序/探路者
这是用作探路者的代码片段,它使用递归方法。但我不太明白它是如何工作的。因此,我们让用户创建迷宫,在他创建之后,我们在main方法中启动findRek方法。我们检查某个字段是墙还是我们已经走过的路径(以“-”号标记)。我们希望标记每个不是开始但仍然空闲的字段 在第二段中,我们使用递归原理,检查顶部、底部、左侧和右侧-这就是我丢失的地方。所以这个方法在这里调用自己,但是在什么情况下它会返回“true”?只有当我们所站的场地是目标时?另外,如果在以某个方向再次调用该方法后得到“false”,会发生什么?那么它会检查每个方向吗 递归方法的最后一段将我们所处的字段设置为自由字段,因为它以前被标记为路径,这将始终导致错误Java 递归迷宫程序/探路者,java,recursion,methods,Java,Recursion,Methods,这是用作探路者的代码片段,它使用递归方法。但我不太明白它是如何工作的。因此,我们让用户创建迷宫,在他创建之后,我们在main方法中启动findRek方法。我们检查某个字段是墙还是我们已经走过的路径(以“-”号标记)。我们希望标记每个不是开始但仍然空闲的字段 在第二段中,我们使用递归原理,检查顶部、底部、左侧和右侧-这就是我丢失的地方。所以这个方法在这里调用自己,但是在什么情况下它会返回“true”?只有当我们所站的场地是目标时?另外,如果在以某个方向再次调用该方法后得到“false”,会发生什么
private static boolean findRek(char[][] lab, int x, int y) {
if (lab [y][x] == GOAL)
return true;
if (lab [y][x] == WALL)
return false;
if (lab [y][x] == PATH)
return false;
if (lab [y][x] != START)
lab[y][x] = PATH;
if (findRek(lab, x, y-1))
return true;
if (findRek(lab, x+1, y))
return true;
if (findRek(lab, x, y+1))
return true;
if (findRek(lab, x-1, y))
return true;
lab[y][x] = FREE;
return false;
}
...
public static void main(String[]args) {
boolean yes = findRek(lab);
if(yes) {
...
因为这被称为可能的重复:这并不是说我不理解泛型中的递归,但我不太了解布尔变量的工作原理
所以这个方法在这里调用自己,但是在什么情况下它会返回“true”
每个递归基本上都向前迈出了一步。一旦到达目标
(需要X个步骤,即X个递归调用),第一个if
语句返回true
,当递归调用返回true
,该方法也将返回true
,因此当它达到目标时,整个递归调用堆栈将由Xreturntrue
语句展开
只有当我们所站的场地是目标时
这就是触发展开的原因,导致初始调用返回true
,即找到目标路径,目标路径在迷宫中留下标记
另外,如果在以某个方向再次调用该方法后得到“false”,会发生什么
当向前一步(也称为递归调用)点击墙
或路径
时,它将返回false
,表示“方向错误”。然后,呼叫者将跳过以尝试另一个方向。如果所有4个方向都以“错误方向”结束,那么很明显我们在通往目标的错误路径上,因此该方法将撤消单步执行到当前位置并返回false
,因此上一步可以尝试它的其他方向。这就是所谓的
那么它会检查每个方向吗
在找到目标之前,是的。为什么可能重复?这个问题是关于布尔变量的,我并不是不理解递归。通过阅读你的问题,我推断你的问题是理解递归是如何工作的。谢谢你的回答!例如,当我们站在点P,然后我们向右走3步,像P->P_1->P_2->P_3,程序在所有这些情况下都返回“true”并标记每一步,但是当他在P_3->WALL碰到一堵墙时,他会检查顶部和底部,但是在这些情况下,当他再次碰到一堵墙时,他会返回到P并将其重新设置为自由?在所有这些情况下,如果“正确”是第一个检查的方向,则“programm”返回“true”(不是,但假设是),向右走3步,然后还没有返回调用,因此没有返回任何true
或false
值。如果您不理解这一点,那么我认为您根本不理解递归。