Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблема инициализации переменной в треугольнике Паскаля

Delphi , Компоненты и Классы , Коллекции

Заголовок:

При решении задачи по построению треугольника Паскаля, который принимает на вход число строк (int numRows) и возвращает список со всеми строками треугольника, многие программисты сталкиваются с ошибкой инициализации переменной. В данной статье мы рассмотрим причину этой ошибки и предложим альтернативное решение.

Описание проблемы

При попытке реализовать треугольник Паскаля с помощью следующего кода:

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> rows = new ArrayList<>();
        List<Integer> pre, row = null;

        for(int i=0; i<numRows; ++i){
            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;
    }
}

мы получаем ошибку:

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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Коллекции ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:10:25/0.0034480094909668/0