(1 курс ФИИТ) ОП — практика

К сожалению, задание не доступно, есть вариант использовать из джинерика(если не ошибаюсь) - стек, дабы не использовать системный, а обернуть его в цикле, т.е затраты чуть поменьше, а результат тот же!!!

Реализуйте процедуру печати дерева с переходом на новую строку PrintlnTreeInfix2 (при инфиксном обходе), которая для пустого дерева (то есть значения nil) выводит сообщение “empty tree”

Замечание. Цель задания — альтернативная реализация подпрограммы печати из лабораторной работы.

Указание. На этот раз не используйте уже готовые подпрограммы. Процедура PrintlnTreeInfix2 должна быть реализована рекурсивно без использования вспомогательных подпрограмм.

Да, я думаю тут ошибка. Без вспомогательных п/п нужно реализовать Print, выводящий <empty tree> для пустого дерева, а не Println.

Контрольная работа по рекурсии на следующей неделе.

А можно конкретные даты озвучить? Если это не тайна, конечно.

У 1.8-2 и 1.9-2 в понедельник, у 1.8-2 и 1.9-1 в среду.

Сегодня открывается тест «Динамические структуры данных и рекурсия».

Спешите выполнить тест!

Домашнее задание. Неделя #12 точная копия предыдущего. Исправте, пожалуйста.

А, так оно ещё не готово, откроется в субботу, как обычно. Спасибо за информацию!

Всем привет! Хочу поделиться прекрасным. Во-первых, сегодня мы нарисовали UML-подобную диаграмму для поездов. Привожу её здесь в надежде, что она кому-то облегчит жизнь. Возможны неточности и расхождения по именам свойств.

Второе, тоже связано с поездами. Сегодня после занятия убил два часа, чтобы выполнить задание:

Напишите функцию, которая по набору активных маршрутов возвращает ассоциативный массив Dictionary<string, StationTimetable> (ключи — названия станций/остановок). Замечание. Для реализации запрещается использовать цикл.

Получилось так.

function CreateTimetables(ar: list<ActiveRoute>): Dictionary<string, StationTimetable>;
begin
  Result := ar 
    .Select(TrainStops)
    .Aggregate((lhs; rhs) -> lhs.Concat(rhs).ToList())
    .GroupBy(t -> t.aroute.RouteInfo.Stops[t.nameId].Name)
    .ToDictionary(group -> group.Key, group -> new StationTimetable(group.ToList()));
end;

Select-Aggregate можно заменить на SelectMany, но тогда нужно писать внутрь ему странную лямбда-функцию: SelectMany(ar -> TrainStops(ar)), это на лекциях спрашивайте почему так: что-то там разработчики не допилили.

Благодарю студента Дмитрия Дядичко за терпеливое сопровождение меня в процессе решения.

1 лайк

А с каких пор на первом курсе рассказывают лямбды? о_О

ну, процедурный тип же изучается, а лямбды гораздо проще и понятнее

@ibond, это чистая правда, но от вас я ожидал комментария, почему функцию передать в SelectMany нельзя, а лямбду можно. Наша функция TrainStops возвращает List, а SelectMany принимает Func, которая возвращает IEnumerable. Поскольку в ПАБЦ нет возможности указывать вариантость параметров шаблонных типов, то оно и не компилируется. А лямбда, которая просто взывает эту функцию, почему-то проходит.

Не проходит по совершенно понятной причине.

ar -> TrainStops(ar)

преобразуется в function Anonym1(ar: …): IEnumerable<…> а List преобразуется к IEnumerable, так что всё корректно.

Когда Вы передаёте функцию как параметр, надо следить, чтобы ровно все типы соответствовали - никаких вариантностей.

Почему наша не проходит, я понимаю. Я не понял, почему лямбда возвращает IEnumerable…

Это вот почему. Параметры лямбды и тип возвращаемого значения всегда выводятся наоборот - от формальных параметров к фактическим. То есть, заголовок лямбды вместе с типами определяется формальным параметром, а тело становится телом генерируемой функции. И если тип возвращаемого значения в теле не совместим по присваиванию с типом возвращаемого значения в описании, то будет ошибка. Здесь - совместим. Но не совпадает.

Я всегда считал, что вывод типов параметров и типа возвращаемого значения это разные вещи, но в целом примерно понятно: заголовок лямбды вычисляется из контекста, а потом к нему лепится тело. В такой схеме всё работает. Но ощущения от этого глубоко отрицательные: нужно писать бессмысленную лямбду, которая просто вызывает нашу функцию, вместо передачи самой этой функции.

Группа 1.8, а скажите, пожалуйста, вы хотите контрольную в среду или в понедельник? А то ходят слухи, что в среду коллоквиум по мат. анализу. Если в понедельник, то в среду придётся гулять (а Данилу в среду пропущеную к-р писать).

Поскольку никто не отозвался, в моей подгруппе к-р остаётся на завтра.