Я работал над проблемой крысиного лабиринта (вы можете перемещаться вправо или вниз, если 1, а не где, если 0). У меня были проблемы, что мой результат не вернул бы стек, я проследил его, и все казалось прекрасным, затем я изменил свой код, и это сработало, и я не понимал, как мой след некорректен.Java, отслеживание рекурсии на лабиринте крысы
Я отправлю 3 версии кода, сначала правильно, затем 2 неверно. Мой вопрос в том, что правильный след каждого рекурсивного кода, чтобы я мог в следующий раз правильно отслеживать свой собственный код и понимать, что я правильно его отслеживаю, чтобы найти ошибку.
Я должен упомянуть результат является число путей можно достичь [п-1] [M-1]
правильный код
import java.io.*;
import java.util.*;
class Solution {
public static int findpath(int [][] arr){
int row = 0;
int col = 0;
int result = 0;
return findpathHelper(arr, row, col, result);
}
public static int findpathHelper(int [][] arr, int row, int col, int result){
System.out.println(row);
System.out.println(col);
System.out.println();
if(col == arr[row].length-1 && row == arr.length-1){
System.out.println("Result: " +result);
return result+1;
}
if(row+1 != arr.length && arr[row+1][col] != 0){
result = findpathHelper(arr, row+1, col, result);
}
if(col+1 != arr[row].length && arr[row][col+1] != 0){
result = findpathHelper(arr, row,col+1, result);
}
return result;
}
public static void main(String[] args) {
int [][] path = {{1,1,1,1},
{0,1,1,1},
{1,0,0,1},
{1,1,1,1}};
System.out.println(findpath(path));
}
}
неправильный код 1 Результат всегда будет 0 до стека вызовов, даже после обновления в базовом футляре Я просто избавился от 'result =' в рекурсивных случаях
import java.io.*;
import java.util.*;
class Solution {
public static int findpath(int [][] arr){
int row = 0;
int col = 0;
int result = 0;
return findpathHelper(arr, row, col, result);
}
public static int findpathHelper(int [][] arr, int row, int col, int result){
System.out.println(row);
System.out.println(col);
System.out.println();
if(col == arr[row].length-1 && row == arr.length-1){
System.out.println("Result: " +result);
return result+1;
}
if(row+1 != arr.length && arr[row+1][col] != 0){
findpathHelper(arr, row+1, col, result);
}
if(col+1 != arr[row].length && arr[row][col+1] != 0){
findpathHelper(arr, row,col+1, result);
}
return result;
}
public static void main(String[] args) {
int [][] path = {{1,1,1,1},
{0,1,1,1},
{1,0,0,1},
{1,1,1,1}};
System.out.println(findpath(path));
}
}
неправильный код 2 В базовом случае я избавилась от возвращения, и вместо этого я использую возврат + = 1, в первом стеке вызовов это 1, но, как она идет обратно в стек он возвращается будучи 0.
import java.io.*;
import java.util.*;
class Solution {
public static int findpath(int [][] arr){
int row = 0;
int col = 0;
int result = 0;
return findpathHelper(arr, row, col, result);
}
public static int findpathHelper(int [][] arr, int row, int col, int result){
System.out.println(row);
System.out.println(col);
System.out.println();
if(col == arr[row].length-1 && row == arr.length-1){
System.out.println("Result: " +result);
result+=1;
}
if(row+1 != arr.length && arr[row+1][col] != 0){
return = findpathHelper(arr, row+1, col, result);
}
if(col+1 != arr[row].length && arr[row][col+1] != 0){
return = findpathHelper(arr, row,col+1, result);
}
return result;
}
public static void main(String[] args) {
int [][] path = {{1,1,1,1},
{0,1,1,1},
{1,0,0,1},
{1,1,1,1}};
System.out.println(findpath(path));
}
}
Редактировать Доп Going 2-го некорректного кода, если я добавляю возвращение = по нац e рекурсивных случаях, но не в базовом случае код по-прежнему кажется штрафом import java.io. ; импорт java.util.;
class Solution {
public static int findpath(int [][] arr){
int row = 0;
int col = 0;
int result = 0;
return findpathHelper(arr, row, col, result);
}
public static int findpathHelper(int [][] arr, int row, int col, int result){
System.out.println(row);
System.out.println(col);
System.out.println();
if(col == arr[row].length-1 && row == arr.length-1){
System.out.println("Result: " +result);
result+=1;
}
if(row+1 != arr.length && arr[row+1][col] != 0){
result = findpathHelper(arr, row+1, col, result);
}
if(col+1 != arr[row].length && arr[row][col+1] != 0){
result = findpathHelper(arr, row,col+1, result);
}
return result;
}
public static void main(String[] args) {
int [][] path = {{1,1,1,1},
{0,1,1,1},
{1,0,0,1},
{1,1,1,1}};
System.out.println(findpath(path));
}
}