Ошибка ArrayIndexOutOfBoundsException в программировании возникает, когда попытка доступа к элементу массива выходит за его пределы. В контексте рекурсивного заполнения двумерного массива по треугольнику Паскаля, такая ошибка может быть вызвана неправильной логикой управления индексами массива. В данном случае, проблема заключается в неправильной проверке индексов при рекурсивных вызовах функции.
Контекст проблемы
Проблема возникает на следующей строке кода:
else if (col >= pTriangle[row].length && row < pTriangle.length)
Если переменная row принимает значение pTriangle.length - 1, то вызов populateT(row+1, col) приведет к рекурсивному вызову с индексом, выходящим за пределы массива. Это происходит потому, что pTriangle.length используется как индекс для следующего ряда, что некорректно.
Подтвержденное решение
Для исправления ошибки, необходимо изменить условия проверки индексов следующим образом:
Условие if (col < pTriangle[row].length && row < pTriangle.length) следует изменить на if (col < row).
Условие else if (col >= pTriangle[row].length && row < pTriangle.length) следует изменить на else if (col >= row && row < pTriangle.length - 1).
Также требуется внести изменения в логику добавления элементов из предыдущего ряда:
Изменить (pTriangle[row-1][col-1]) + (pTriangle[row-1][col+1]) на (pTriangle[row-1][col-1]) + (pTriangle[row-1][col]).
Альтернативные изменения в коде
Кроме того, в коде, отвечающем за вывод, следует добавить пробелы для лучшей визуализации элементов массива. В функции getLine необходимо внести изменение для добавления пробелов между числами. Также, учитывая, что println уже выводит каждую строку с новой строки, нет необходимости добавлять символ перевода строки (\n).
Пример кода на Object Pascal (Delphi)
procedure populateT(row, col: Integer);
begin
if (col < row) then
populateT(row, col + 1);
else if (col >= row && row < pTriangle.length - 1) then
begin
// Логика заполнения массива...
end;
end;
function getLine(row: Integer): string;
begin
// Логика формирования строки для вывода...
result := '';
for var c := 0 to row - 1 do
begin
if (row != 0 && c == 0 || c == row) then
result := result + '1';
else if(row > 1 && c != 0 && c != row) then
result := result + (pTriangle[row-1][c-1] + pTriangle[row-1][c]).ToString + ' ';
end;
result := result + #10; // Добавление перевода строки
end;
Заключение
В данной статье был рассмотрен пример возникновения ошибки ArrayIndexOutOfBoundsException при рекурсивном заполнении двумерного массива по треугольнику Паскаля и предложено решение, включающее в себя изменение логики проверки индексов и добавления элементов из предыдущего ряда. Приведенные изменения позволят избежать выхода за границы массива и корректно заполнить двумерный массив согласно правилам треугольника Паскаля.
Рекурсивное заполнение двумерного массива по треугольнику Паскаля в Delphi требует корректировки логики проверки индексов, чтобы избежать ошибки выхода за границы массива.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.