При решении задачи по построению треугольника Паскаля, который принимает на вход число строк (int numRows) и возвращает список со всеми строками треугольника, многие программисты сталкиваются с ошибкой инициализации переменной. В данной статье мы рассмотрим причину этой ошибки и предложим альтернативное решение.
Описание проблемы
При попытке реализовать треугольник Паскаля с помощью следующего кода:
Line 12: error: variable pre might not have been initialized
row.add(pre.get(j-1)+pre.get(j));
Однако, после изменения четвертой строки на List<Integer> row, pre = null;, код начинает работать без ошибок. В чем причина этой ошибки и как ее исправить?
Причина ошибки
Ошибка связана с инициализацией переменной pre. В Java, инициализатор применяется только к переменной, стоящей перед ним. Таким образом, List<Integer> pre, row = null; инициализирует только row, а List<Integer> row, pre = null; инициализирует только pre. Чтобы инициализировать обе переменные, нужно использовать List<Integer> pre = null, row = null;.
Альтернативное решение
Однако, нет необходимости инициализировать row с null в данном случае. Более того, проблема не в порядке переменных, а в том, что переменная pre используется до ее инициализации в первом цикле.
Чтобы исправить это, мы можем перенести логику первого цикла перед основным циклом:
public List<List<Integer>> generate(int numRows) {
if(numRows <= 0) return Collections.emptyList();
List<List<Integer>> rows = new ArrayList<>();
List<Integer> pre = Collections.singletonList(1);
rows.add(pre);
for(int i = 1; i < numRows; ++i) {
List<Integer> row = new ArrayList<>();
for(int j = 0; j <= i; ++j) {
if(j == 0 || j == i)
row.add(1);
else
row.add(pre.get(j - 1) + pre.get(j));
}
pre = row;
rows.add(row);
}
return rows;
}
В этом решении мы добавляем первую строку треугольника в список rows перед циклом и начинаем цикл со второй строки. Это позволяет нам избежать инициализации переменной с неиспользуемым значением.
Пример на Object Pascal (Delphi)
В Object Pascal (Delphi) мы можем реализовать ту же самую задачу следующим образом:
program PascalTriangle;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.Generics.Collections;
type
TIntegerList = TList<Integer>;
TIntegerListList = TList<TIntegerList>;
function Generate(numRows: Integer): TIntegerListList;
var
i, j: Integer;
pre, row: TIntegerList;
begin
if numRows <= 0 then
Exit(nil);
Result := TIntegerListList.Create();
pre := TIntegerList.Create();
pre.Add(1);
Result.Add(pre);
for i := 1 to numRows - 1 do
begin
row := TIntegerList.Create();
for j := 0 to i do
begin
if j = 0 or j = i then
row.Add(1)
else
row.Add(pre[j - 1] + pre[j]);
end;
pre.Free;
pre := row;
Result.Add(pre);
end;
Result.AsObject.Free;
end;
var
triangle: TIntegerListList;
i, j: Integer;
begin
triangle := Generate(5);
for i := 0 to triangle.Count - 1 do
begin
for j := 0 to triangle[i].Count - 1 do
Write(triangle[i][j]:3);
Writeln;
end;
Readln;
end.
В этом примере мы используем генераторы списков из библиотеки Generics.Collections для реализации треугольника Паскаля. Мы также добавляем первую строку в список перед циклом и начинаем цикл со второй строки, чтобы избежать ошибки инициализации переменной.
Заключение
При решении задачи по построению треугольника Паскаля важно правильно инициализировать переменные, чтобы избежать ошибок. В данной статье мы рассмотрели причину ошибки инициализации переменной в треугольнике Паскаля и предложили альтернативное решение, которое позволяет избежать этой ошибки. Мы также продемонстрировали, как реализовать ту же задачу на Object Pascal (Delphi).
Данный контекст посвящен проблеме инициализации переменной в процессе построения треугольника Паскаля в коде на Java, где описывается ошибка, ее причина и альтернативное решение, а также приводятся примеры реализации на Object Pascal (Delphi).
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.