Я просто не могу получить рекурсию, особенно со сложными примерами. Я был бы очень признателен, если бы кто-то потратил некоторое время, чтобы объяснить это. У меня буквально есть 4 листа бумаги, заполненных мной, отслеживающих эту функцию, но я понятия не имею, как ее собрать.Advanced Recursion in Java
public static String shortestPath(int x, int y, int tX, int tY,boolean blocked[][]) {
if(x>blocked.length-1 || y>blocked[0].length-1 || x<0 || y<0)
return null;
if(blocked[x][y]==true)
return null;
if(x==tX && y==tY)
return "";
String paths[]=new String[4];
blocked[x][y]=true; //this just means this coordinate is blocked, so dont use it
paths[0]=shortestPath(x, y+1, tX, tY, blocked);
paths[1]=shortestPath(x, y-1, tX, tY, blocked);
paths[2]=shortestPath(x+1, y, tX, tY, blocked);
paths[3]=shortestPath(x-1, y, tX, tY, blocked);
blocked[x][y] = false;
int result=findShortestString(paths, 0, 3);
//findShortestString just takes an array of strings,
//with 0 being the lo index and 3 being the hi,
//and returns the index that contains the string with the shortest length.
//5
if(paths[result]==null)
return null;
else{
if(result==0)
return 'N' + paths[result];
if(result==1)
return 'S' + paths[result];
if(result==2)
return 'E' + paths[result];
if(result==3)
return 'W' + paths[result];}
return paths[result];
Так что этот код делает это, Дано х и у параметра, он говорит вам кратчайшее комбинацию ходов вы должны сделать (NSWE на север, юг, запад, восток), чтобы выйти в tX и tY. Код работает отлично, но я понятия не имею, как это сделать.
Когда я пытаюсь проследить, какие пути [0] вычисляет, он всегда приходит к нулю, потому что y всегда будет продолжать увеличиваться, пока он не выйдет за пределы, в котором он возвращает null. Это тот же случай для путей [1] [2] и [3], все они возвращаются к нулю, не так ли? Итак, как работает эта функция?
Возможный дубликат [Понимание рекурсии в Java немного лучше] (http://stackoverflow.com/questions/4170207/understanding-recursion-in-java-a-little-better) – EJP