我遇到了一个递归Java程序的问题,目前的问题是我不明白为什么基础case1 if正在执行。在对findPath的初始方法调用中,传递值2和0。 exitRow = 4和cols-1 = 11.所以,我的理解是这个基本情况不应该首先输入if语句,因为maze [] []中的两个位置不一样(迷宫[4] [11]! =迷宫[2] [0])。但这正是它正在做的事情。我很明显错过了对if结构的理解,或者我在其他地方有错误,并会感谢一些帮助。
注意:我也试过
if (row == exitRow && col == cols-1)
但这最终给了我一个堆栈溢出。从我对此的了解很少,这意味着我的递归不会让我更接近基本情况,或者基本情况因为它的编写方式而无法访问。根据我一直在使用的本指南http://www.cs.bu.edu/teaching/alg/maze/,我假设我的递归是正确的。这让我相信基本情况就是问题所在。
非常感谢。
private Boolean findPath(int row, int col)
{
//base case 1
if (maze[exitRow][cols-1]==maze[row][col])
{
System.out.println("test");//for debugging
return true;
}
//base case 2
if (maze[row][col] == '#')
{
return false;
}
maze[row][col] = 'O';
System.out.println("test1");//for debugging
steps++;
//check north
if (findPath(row+1,col)==true )
{
return true;
}
//check east
if (findPath(row,col+1)==true )
{
System.out.println("test2");
return true;
}
//check south
if (findPath(row-1,col)== true)
{
return true;
}
//check west
if (findPath(row,col-1)== true)
{
return true;
}
System.out.println(steps);
maze[row][col] = '.';//unmark location
return false;
}
答案 0 :(得分:0)
if( maze[exitRow][cols-1]==maze[row][col] )
如果当前图块与退出图块的类型相同,将返回true。由于start和exit都是floor(.
),因此函数立即返回。坚持这一点:
if (row == exitRow && col == cols-1)
这是一个正确的测试,看看你是否找到了出口。现在为溢出:
您将输入的图块标记为O
,但如果标记存在,则永远不会对其进行测试,因此您将向北 - 南 - 北行走(此时您会注意到) - 南......由于您已经测试了墙(if (maze[row][col] == '#')
),因此请测试
if (maze[row][col] != '.')
if (maze[row][col] == '#' || maze[row][col] == 'O')
请注意,您可以将两种情况视为相同,因为效果相同 - 不要去那里。