Пользователь столкнулся с проблемой при попытке написать генератор для Бернуллиева треугольника, используя простой способ сдвига, который является частью вычислительного процесса треугольника Паскаля. В частности, он указал, что при создании суммы каждой строки он не получал ожидаемого результата, а вместо этого генератор выдавал пустой список в каждой последующей итерации после первой.
Треугольник Паскаля, который является последовательностью симплек, где каждый следующий элемент вычисляется как сумма двух предыдущих, может быть представлен в виде списка списков. В Python это будет выглядеть так:
В этом контексте, Бернуллиев треугольник вычисляется через частичные суммы чисел в треугольнике Паскаля. Это означает, что для каждой строки треугольника Паскаля, каждый элемент является суммой элементов подряд с начала этой строки.
Пример кода в Python, который описывает треугольник Паскаля, следующий:
def next_row(row):
n = len(row)
new_row = [row[0]] + [row[i] + row[i+1] for i in range(n - 1)] + [row[-1]]
return new_row
def generate_pascal():
row =[1]
while True:
yield row
row = next_row(row)
Проблема возникает в функции generate_bernoulli(), где после первоначального создания строки треугольника Паскаля, пользователь пытается вычислить часть суммы элементов, не обновляя при этом строку в каждой итерации. Это привело к тому, что переменная n так и осталась равной значению первой строки, а строка row не изменялась, что в свою очередь вызывало зацикливание на пустом списке.
Правильный подход заключается в том, что вызов генератора generate_pascal() должен быть внутри цикла, чтобы с каждым разом обновлять строку. Также, вычисление частичных сумм должно быть выполнено для каждой новой строки, и результат должен быть возвращён как результат работы генератора. Вот исправленный вариант:
def generate_bernoulli():
for row in generate_pascal():
n = len(row)
row = [sum(row[0:i+1]) for i in range(n)]
yield row
Итак, чтобы исправить ошибку, необходимо было включить вызов generate_pascal() в цикл генерации, обновить переменную n для каждой новой строки и правильно вычислить частичные суммы для каждого элемента строки.
Вот как это можно реализовать на языке Object Pascal (Delphi):
program BernoulliTriangle;
{$APPTYPE CONSOLE}
type
TIntArray = TArray<Integer>;
function NextRow(const Row: TIntArray): TIntArray;
var
n, i: Integer;
begin
n := Length(Row);
SetLength(Result, n + 1);
Result[0] := Row[0];
for i := 0 to n - 2 do
Result[i + 1] := Row[i] + Row[i + 1];
Result[n] := Row[n - 1];
end;
function GeneratePascal: TFunc<TIntArray, Boolean>;
var
Row: TIntArray;
begin
Row := TIntArray.Create(1);
Result := True;
while Result do
begin
SetLength(Row, Length(Row) + 1);
Row[0] := Row[1];
for var i := 1 to High(Row) - 1 do
Row[i] := Row[i] + Row[i + 1];
Yield Row;
Row := NextRow(Row);
end;
end;
function GenerateBernoulli: TFunc<TIntArray, Boolean>;
var
Row, Sum: TIntArray;
begin
for Row in GeneratePascal do
begin
SetLength(Sum, Length(Row));
Sum[0] := Row[0];
for var i := 1 to High(Row) do
Sum[i] := Sum[i - 1] + Row[i];
Yield Sum;
end;
end;
var
BernoulliRow: TIntArray;
begin
for BernoulliRow in GenerateBernoulli do
begin
for var Value in BernoulliRow do
Write(Value, ' ');
Writeln;
end;
Readln;
end.
Этот пример демонстрирует, как написать аналогичную функциональность на Delphi, используя механизмы, аналогичные генераторам в Python.
Пользователь столкнулся с проблемой в написании генератора для Бернуллиева треугольника в Python, когда после первой итерации генератор начал выдавать пустой список, потому что не обновлялась строка треугольника Паскаля и не вычислялись частичные суммы д
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.