Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归迷宫程序/探路者_Java_Recursion_Methods - Fatal编程技术网

Java 递归迷宫程序/探路者

Java 递归迷宫程序/探路者,java,recursion,methods,Java,Recursion,Methods,这是用作探路者的代码片段,它使用递归方法。但我不太明白它是如何工作的。因此,我们让用户创建迷宫,在他创建之后,我们在main方法中启动findRek方法。我们检查某个字段是墙还是我们已经走过的路径(以“-”号标记)。我们希望标记每个不是开始但仍然空闲的字段 在第二段中,我们使用递归原理,检查顶部、底部、左侧和右侧-这就是我丢失的地方。所以这个方法在这里调用自己,但是在什么情况下它会返回“true”?只有当我们所站的场地是目标时?另外,如果在以某个方向再次调用该方法后得到“false”,会发生什么

这是用作探路者的代码片段,它使用递归方法。但我不太明白它是如何工作的。因此,我们让用户创建迷宫,在他创建之后,我们在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
,因此当它达到
目标时,整个递归调用堆栈将由X
returntrue
语句展开

只有当我们所站的场地是目标时

这就是触发展开的原因,导致初始调用返回
true
,即找到目标路径,目标路径在迷宫中留下标记

另外,如果在以某个方向再次调用该方法后得到“false”,会发生什么

当向前一步(也称为递归调用)点击
路径
时,它将返回
false
,表示“方向错误”。然后,呼叫者将跳过以尝试另一个方向。如果所有4个方向都以“错误方向”结束,那么很明显我们在通往目标的错误路径上,因此该方法将撤消单步执行到当前位置并返回
false
,因此上一步可以尝试它的其他方向。这就是所谓的

那么它会检查每个方向吗


在找到
目标之前,是的。

为什么可能重复?这个问题是关于布尔变量的,我并不是不理解递归。通过阅读你的问题,我推断你的问题是理解递归是如何工作的。谢谢你的回答!例如,当我们站在点P,然后我们向右走3步,像P->P_1->P_2->P_3,程序在所有这些情况下都返回“true”并标记每一步,但是当他在P_3->WALL碰到一堵墙时,他会检查顶部和底部,但是在这些情况下,当他再次碰到一堵墙时,他会返回到P并将其重新设置为自由?在所有这些情况下,如果“正确”是第一个检查的方向,则“programm”返回“true”(不是,但假设是),向右走3步,然后还没有返回调用,因此没有返回任何
true
false
值。如果您不理解这一点,那么我认为您根本不理解递归。