【问题标题】:recursive labyrinth program / pathfinder递归迷宫程序/探路者
【发布时间】:2016-12-04 19:09:08
【问题描述】:

这是作为探路者的代码的 sn-p,它使用递归方法。我不太明白它是如何工作的。所以,我们让用户创建迷宫,在他创建之后,我们在 main 方法中启动 findRek 方法。我们检查某个字段是墙还是我们已经走过的路径(用“ - ”标记)。我们要标记不是开始但仍然是空闲的每个字段。

在第二段中,我们使用递归原理,检查上、下、左和右——那是我迷路了。所以这个方法在这里调用了自己,但是在什么情况下它会返回一个“true”呢?只有当我们站在的领域是目标?另外,如果我们在某个方向再次调用该方法后得到“假”,会发生什么?那么它会检查每个方向吗?

递归方法的最后一段将我们所在的字段设置为空闲,因为它之前被标记为路径,这总是会导致错误。

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) {

...

由于这被称为可能重复:我不是不了解泛型的递归,而是我不太了解这里的布尔变量的操作原理。

【问题讨论】:

  • 为什么?这个问题是专门关于布尔变量的,这并不是我一般不了解递归。
  • 通过阅读您的问题,我了解到您的问题是了解递归的工作原理。

标签: java recursion methods


【解决方案1】:

所以这里的方法是在调用自己,但是在什么情况下它会返回一个“true”呢?

每次递归基本上都是向前迈了一步。一旦到达GOAL(需要X步,即X递归调用),第一个if语句返回true,当递归调用返回true时,该方法也会返回true,所以当它到达GOAL 时,整个递归调用堆栈将被 X return true 语句解开。

只有当我们站在的领域是目标?

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

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

当向前一步,也就是递归调用,遇到WALLPATH,它将返回false,表示“方向错误”。然后,呼叫者将跳过尝试另一个方向。如果所有 4 个方向都以“错误的方向”结束,则很明显我们走错了通往目标的路径,因此该方法将撤消步进到当前位置并返回false,因此上一步可以尝试其他方向。这称为 backtracking

那么它会检查每个方向吗?

直到找到GOAL,是的。

【讨论】:

  • 感谢您的回答!因此,例如,当我们站在 P 点,然后像 P -> P_1 -> P_2 -> P_3 向右走 3 步时,程序在所有这些情况下都返回“true”并标记每一步,但是当他在 P_3 -> WALL 处击中 WALL 时,他会检查顶部和底部,但在这种情况下再次击中 WALL 时,他会返回 P 并将其设置回 FREE?
  • "programm 在所有这些情况下都返回 "true"" 如果 "right" 是检查的第一个方向(它不是,但我们假设它是),你让向右走 3 步,然后还没有调用返回,所以没有返回 any truefalse 值。如果你不明白这一点,那么我认为hotzst might have been right 你根本不懂递归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2016-05-14
  • 2013-12-09
相关资源
最近更新 更多