Треугольник Паскаля — это числовая структура, где каждый элемент наряду с двумя числами выше него, является суммой этих чисел. Это классическая задача для программистов, которая позволяет улучшить навыки работы с массивами и понимание алгоритмов.
Оригинальный заголовок:
Проблема смещения в генерации треугольника Паскаля на C/Objective-C
Описание проблемы (вопрос):
Автор вопроса столкнулся с проблемами при генерации треугольника Паскаля в C/Objective-C. Начиная с четвертой строки, вывод стал неверным. Треугольник Паскаля начинается с единицы, и каждая последующая цифра в строке — это сумма двух чисел из предыдущей строки.
Ваш текущий вывод:
1
1 1
1 2 1
1 3 3 1
4 6 3 1
Правильный вывод:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Ваш исходный код:
// ... код ...
int iterations, i, b, mid, chars, temp;
NSLog(@"Please enter the number of itereations");
scanf("%i",&iterations); // прием ввода пользователя
// расчет позиции первого 1
if (iterations % 2 == 0) mid = (iterations)/2;
else mid = (iterations+1)/2;
chars = iterations*2;
int solutions[iterations][chars];
// сброс значений
for (i = 0; i<iterations; i++) {
for (b = 0; b<chars; b++) {
solutions[i][b] = 0;
}
}
solutions[0][mid] = 1; // начальное 1 в первой строке
// основной алгоритм
for (int row = 1; row<iterations; row++) {
for (int chi = 0; chi<chars; chi++) {
temp = 0;
if (chi > 0) temp += solutions[row-1][chi-1];
if (chi < iterations) temp += solutions[row-1][chi+1];
solutions[row][chi] = temp;
}
}
// вывод
// ... код ...
Анализ проблемы и её решение:
Проанализировав ваш код, можно заметить, что проблема заключается в расчете позиции первого элемента в каждой строке и в условии второго цикла, где происходит добавление соседних элементов предыдущей строки. В частности, переменная mid должна быть рассчитана как iterations - 1, а условие во втором цикле должно быть chi < chars - 1, чтобы избежать выхода за пределы массива.
Исправленный код:
// расчет позиции первого 1
mid = iterations - 1;
// основной алгоритм
for (int row = 1; row<iterations; row++) {
for (int chi = 0; chi<chars; chi++) {
temp = 0;
if (chi > 0) temp += solutions[row-1][chi-1];
if (chi < chars - 1) temp += solutions[row-1][chi+1]; // исправленное условие
solutions[row][chi] = temp;
}
}
После внесения этих изменений, ваш код должен корректно генерировать треугольник Паскаля.
Примечание:
Автор вопроса также упомянул, что добавление NSLog() в циклы генерации и вывода может помочь отладить код и определить, где именно возникает проблема.
Теперь, когда мы рассмотрели проблему и её решение, давайте перейдем к примеру генерации треугольника Паскаля на языке Object Pascal (Delphi), который является более близким к тематике вашего сайта.
Пример на Object Pascal (Delphi):
program PascalTriangle;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
var
Iterations: Integer;
Solutions: array of array of Integer;
Row, Column, Mid, Chars: Integer;
Temp: Integer;
procedure Initialize(var Arr: TArray<Integer>; Value: Integer);
begin
SetLength(Arr, Length(Arr), Value);
end;
procedure PrintRow(const RowData: TArray<Integer>);
var
SpaceCount: Integer;
begin
SpaceCount := Length(Solutions) div 2 - Length(RowData);
WriteLn(SpaceCount * ' ', RowData);
end;
begin
WriteLn('Please enter the number of iterations: ');
ReadLn(Iterations);
Mid := Iterations - 1;
Chars := Iterations * 2;
SetLength(Solutions, Iterations, TArray<Integer>.Create(Chars, 0));
Initialize(Solutions[0], 1);
Solutions[0][Mid] := 1;
for Row := 1 to Iterations - 1 do
for Column := 0 to Chars - 1 do
if Column > 0 then
Solutions[Row][Column] := Solutions[Row][Column] + Solutions[Row - 1][Column - 1];
if Column < Chars - 1 then
Solutions[Row][Column] := Solutions[Row][Column] + Solutions[Row - 1][Column + 1];
for Row in Solutions do
PrintRow(Row);
end.
Этот код на Object Pascal демонстрирует, как можно использовать встроенные возможности языка для работы с динамическими массивами и процедурами, что упрощает чтение и поддержку кода.
Вопрос связан с исправлением кода на языке C/Objective-C для корректной генерации треугольника Паскаля, где наблюдается проблема смещения в выводе начиная с четвертой строки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.