Здесь приведены примеры программ и алгоритмов, используемых в курсе Основы программирования для студентов 1 курса ФИИТ мехмата ЮФУ
Редактировать

Последовательности - опредление

Последовательность – набор элементов, которые можно перебирать один за другим.

Последовательность:

  • Вообще говоря не хранится в памяти целиком
  • Задает алгоритм получения значений одно за другим
  • В каждый момент в памяти одно значение
  • Цикл по последовательности – цикл foreach
  • Массивы и списки – разновидности последовательностей

Пользовательские генераторы последовательностей

function Arithm(n: integer; a0,h: real): sequence of real;
begin
  var x := a0;
  loop n do
  begin
    yield x;
    x += h;
  end;
end;

begin
  Arithm(10,11,3).Println;
  foreach var x in Arithm(10,11,3) do
    Print(x);
end.

Оператор yield возвращает значение из генератора и запоминает место, на котором мы остановились в функции. При вычислении следующего значения код продолжает выполняться с запомненного места.

Генераторы бесконечных последовательностей

function inf: sequence of integer;
begin
  while True do
    yield 1;
end;

function Take(s: sequence of integer; n: integer): sequence of integer;
begin
  var i := 1;
  foreach var x in s do
  begin
    yield x;
    i += 1;
    if i > n then break;
  end;
end;

begin
  Take(inf,10).Print;
end.

Простые задачи на последовательности

Задача 1. Симметрична ли последовательность

a.SequenceEqual(a.Reverse);

Задача 2. Все ли элементы последовательности различны

a.Count = a.Distinct.Count;

Задача 3. Совпадают ли первая и вторая половина последовательности длины n

var n2 := n div 2;
a.Take(n2).SequenceEqual(a.Skip(n2));

Задача 4. Найти второй максимум последовательности

a.OrderDescending.Distinct.Skip(1).First;

Задача 5. Функция проверки x на простоту

function IsPrime(x: integer) := (2..x.Sqrt.Round).All(i -> x mod i <> 0);

Задача 6. Количество простых чисел, меньших n

function IsPrime(x: integer) := (2..x.Sqrt.Round).All(i -> x mod i <> 0);

begin
  var n := 50000;
  (2..n).Where(IsPrime).Count.Println;
  MillisecondsDelta.Println;
end.

Задача 7. Табулирование значений функции

PartitionPoints(1,2,10).PrintLines(x -> $'{x,4:f1} {Sin(x),7:f4}');