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

Спасибо, исправлено! Вернуть 0, конечно.

Сегодня в 17-00 открывается новое бонусное задание. Срок выполнения — две недели.

http://edu.mmcs.sfedu.ru/mod/assign/view.php?id=10029 Задание 2 Как без дополнительной процедуры можно организовать PrintlnTreeInfix2? На новую строку должен быть напечатан только один раз, а если мы будем вызывать процедуру рекурсивно для поддеревьев, то будет много переходов на новую строку. Есть идея передавать в рекурсивный вызов в качестве ещё одного параметра ссылку на корень всего дерева или запоминать её в глобальных переменных. Тогда переход на новую строку будем печатать только, если передаваемая TreeNode - это указатель на главный корень. Но мне кажется, что это слишком сложно. В задании нет ошибки?

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

Реализуйте процедуру печати дерева с переходом на новую строку 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…

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