递归函数不从基本条件返回

时间:2015-10-22 22:28:21

标签: java

我试图从基础状态向上,向下,向左或向右返回方向,在递归状态下,我正在寻找可以移动的可能位置。但是程序只返回'q',它在函数启动时被初始化。我知道它与堆栈的展开有关,但我不知道如何解决这个问题。 这是迷宫:

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
if(overlay == self.routeLine1)
{
    if(nil == self.routeLineView1)
    {
        self.routeLineView1 = [[MKPolylineView alloc] initWithPolyline:self.routeLine1];
        self.routeLineView1.fillColor = [UIColor greenColor];
        self.routeLineView1.strokeColor = [UIColor greenColor];
        self.routeLineView1.lineWidth = 5;

    }

    return self.routeLineView1;
}


if(overlay == self.routeLine2)
{
    if(nil == self.routeLineView2)
    {
        self.routeLineView2 = [[MKPolylineView alloc] initWithPolyline:self.routeLine2];
        self.routeLineView2.fillColor = [UIColor orangeColor];
        self.routeLineView2.strokeColor = [UIColor orangeColor];
        self.routeLineView2.lineWidth = 5;

    }

    return self.routeLineView2;
}

return nil;

}

以下是代码:

char [][]Maze = {{'S','#','#','#','#','#'}, 
                 {'.','.','.','.','.','#'},
                 {'#','.','#','#','#','#'},
                 {'#','.','#','#','#','#'},
                 {'.','.','.','#','.','G'},
                 {'#','#','.','.','.','#'}};

3 个答案:

答案 0 :(得分:1)

首先,您可能需要检查并确保您不会超出范围。而不是像

这样的行
if (Maze[x+1][y] == '.')

你想用

检查你的范围
if (x+1<Maze.length && Maze[x+1][y] == '.')

否则你的程序应该崩溃,具体取决于你的起点。

其次,你的迷宫中没有'X',因此所有的递归案例都不会被执行。我认为它们应该是'#' s,所以

if(Maze[x+1][y] == 'X')

从不起作用(除了可能的错误),应该像

if(x+1<Maze.length && Maze[x+1][y] == '#')

以便涉及'#'。这些可能不会产生任何影响,具体取决于您点击'.'的时间,这在您的迷宫中似乎是立即显示。

第三,你永远不会改变方向的价值,所以递归步骤将失败。这条线

BackTrace(Maze, x+1, y);

可能会从'd'的基本案例返回,然后'd'无处可去。我假设您想从基本案例中获得指示,在这种情况下您应该尝试

direction = BackTrace(Maze, x+1, y);

并类似地修改其他3个递归调用。除非'q''.'周围没有'#',否则这会让您无法获得'q'

我不知道这些更改是否会让您的方法按照您的意愿行事,但他们会做的不仅仅是返回 public static char BackTrace(char[][]Maze, int x, int y) { char direction = 'q'; if (x+1<Maze.length && Maze[x+1][y] == '.') { direction = 'd'; } else if (x-1>=0 && Maze[x-1][y] == '.') { direction = 'u'; } else if (y+1<Maze[x].length && Maze[x][y+1] == '.') { direction = 'r'; } else if (y-1>=0 && Maze[x][y-1] == '.') { direction = 'l'; } else { Maze[x][y] = '+'; if(x+1<Maze.length && Maze[x+1][y] == '#') /// Start moving Down { direction = BackTrace(Maze, x+1, y); } else if(x-1>=0 && Maze[x-1][y] == '#') /// Start Moving Up { direction = BackTrace(Maze, x-1, y); } else if(y+1<Maze[x].length && Maze[x][y+1] == '#') /// Start Moving Right { direction = BackTrace(Maze, x, y+1); } else if(y-1>=0 && Maze[x][y-1] == '#') /// Start Moving Left { direction = BackTrace(Maze, x, y-1); } } return direction; }

最终结果:

{{1}}

答案 1 :(得分:0)

好。我知道了。谢谢大家。问题在于,每次堆栈都会解除在更改新值时保留的旧方向值。只需在每次函数调用后添加一个return语句,以便在堆栈展开时返回新值。这是代码:

public static char BackTrace(char[][]Maze, int x, int y)
{
    char direction = 'q';
    if (Maze[x+1][y] == '.')
    {
        direction = 'd';
    }
    else if (Maze[x-1][y] == '.')
    {
        direction = 'u';
    }
    else if (Maze[x][y+1] == '.')
    {
        direction = 'r';
    }
    else if (Maze[x][y-1] == '.')
    {
        direction = 'l';
    }
    else
    {
        Maze[x][y] = '+';
        if(Maze[x+1][y] == 'X')         /// Start moving Down
        {
            direction = BackTrace(Maze, x+1, y);
            return direction;
        }
        else if(Maze[x-1][y] == 'X')    /// Start Moving Up
        {
            direction = BackTrace(Maze, x-1, y);
            return direction;
        }
        else if(Maze[x][y+1] == 'X')    /// Start Moving Right
        {
            direction = BackTrace(Maze, x, y+1);
            return direction;
        }
        else if(Maze[x][y-1] == 'X')    /// Start Moving Left
        {
            direction = BackTrace(Maze, x, y-1);
            return direction;
        }

    }
    return direction;
}

答案 2 :(得分:-1)

您忘记将递归调用的返回值分配给BackTrace到您的变量方向。 (即direction = BackTrace(Maze, x+1, y);等。)