2016-10-22 15 views
-1

Я работал над проблемой крысиного лабиринта (вы можете перемещаться вправо или вниз, если 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));   
} 
} 

ответ

0

А классическая ошибка. Вы забыли вернуть свой результат из условий if.

У вас есть это:

if(col+1 != arr[row].length && arr[row][col+1] != 0){  
    findpathHelper(arr, row,col+1, result); 
} 

Что вы хотите, это:

if(col+1 != arr[row].length && arr[row][col+1] != 0){  
    return findpathHelper(arr, row,col+1, result); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^