2013-11-23 2 views
0

У меня есть задание программирования на Java, и в одном из вопросов мне нужно заполнить логический 2d-массив (матрицу) «ложным» везде. Я сделал это с помощью двух петель следующим образом:Рекурсивно заполнить матрицу (2d-массив) в Java

// The length and width are given 

boolean [][] matrix; 
matrix = new boolean [length][width]; 

int row; 
int col; 

for (row = 0; row < length; row++) 
{ 
    for (col = 0; col < width; col++) 
    { 
     matrix[row][col] = false; 
    } 
} 

Дело в том, что мы только начали рекурсии главу, и я хотел бы, если есть способ сделать то же самое, но на этот раз используя только рекурсию ... Спасибо!

+0

Бывают случаи, когда рекурсия не обязательно является правильным ответом. Вы говорили об этом с вашим инструктором? –

ответ

3

Вы можете имитировать структуру вложенного цикла с помощью рекурсии:

public static void fillWithFalse(boolean[][] array, int row) { 
    if (row < array.length) { 
     fillWithFalse(array[row], 0); 
     fillWithFalse(array, row + 1); 
    } 
} 

public static void fillWithFalse(boolean[] array, int col) { 
    if (col < array.length) { 
     array[col] = false; 
     fillWithFalse(array, col + 1); 
    } 
} 

или

public static void fillWithFalse(boolean[][] array, int row, int col) { 
    if (row < array.length) { 
     if (col < array[row].length) { 
      array[row][col] = false; 
      fillWithFalse(array, row, col + 1); 
     } else { 
      fillWithFalse(array, row + 1, 0); 
     } 
    } 
} 

Это идентичная логика. Но рекурсия не хорошо для такого рода вещей, а также для заполнения массива с фальшивым правильным решением заключается в следующем:

boolean[][] matrix = new boolean[length][width]; 

Поскольку булевы массивы будут по умолчанию инициализируется со всеми элементами, как ложь. Если присваивание буквально заполняет логический массив ложным, это может быть в основном вопрос с трюком, потому что никаких действий не требуется, кроме как создать экземпляр массива.

+0

Прохладный! это именно то, что мне нужно! На самом деле я не знал, что булевские массивы по умолчанию инициализируются ложью как все элементы. Сегодня я узнал что-то новое ... Большое спасибо! –

+0

Добро пожаловать. И действительно, они есть. Все переменные экземпляра и элементы массива инициализируются значениями по умолчанию. Объекты имеют значение null, booleans - false, символы - нулевой символ, а числовые типы - 0. – Radiodef

0

Ну, не знаю, почему это нужно .. но .. вот мое решение:

public static void insertFalse(boolean [][] arr,int row,int column) 
{ 
    if(row == 0&&column==0) 
     return ; 
    arr[row][column] = false; 
    if(column == 0) 
      insertFalse(arr,row-1,arr[0].length-1); 
    else 
     insertFalse(arr, row, column-1); 
} 
+0

На самом деле это не работает из-за условия возврата. Если вы измените false на true, вы увидите, что arr [0] [0] не изменилось. Причина, по-видимому, заключается в том, что все элементы в массиве были ложными для начала. Он также предполагает, что все массивы имеют одинаковую длину, что не требуется в Java. – Radiodef

+0

Radiodef, я заполнил массив «true», чтобы проверить, работает ли он, о второй части, которую вы сказали, я тоже узнал о новых вещах, спасибо. – ranifisch

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