Экзамен 2 семестр 2018-2019

Станислав Станиславович, до экзамена меньше 2-х недель :slight_smile: .Хотелось бы узнать, когда будет выложена программа? И ещё такой момент: нельзя ли перезалить презентации с учётом изменений, внесённых во время лекций?

Ссылка на папку с обновлёнными лекциями: https://drive.google.com/drive/folders/1bcJ4Fdx2JBlq6A1RXPZiKjPQp7kfxZyG?usp=sharing

Принимаю ошибки в презентациях

Программа экзамена: https://drive.google.com/file/d/1Tby1KRs0dtxMU44RQpF2lGU2DjrADMcK/view?usp=drivesdk

Принимаю замечания

Код из презентации по регулярным выражениям при запуске выдаёт не тот результат, который предполагается на слайде. Там должно быть Groups[0], чтобы работало так, как надо

Спасибо. Исправил.

Возник вопрос насчёт AddFirst для двусвязного списка. В презентации приведён вот этот код:

public void AddFirst(T x)
{
 var p = new Node<T>(x, null, First);
 if (First != null)
      First.Prev = p;
 First = p;
 if (Last == null)
      Last = p;
}

Нельзя ли реализовать данный метод по-другому, с одним if-ом? Ведь First и Last могут быть равны null только одновременно, в том случае, когда в списке нет ни одного элемента.

public void AddFirst(T x)
        {
            var p = new Node<T>(x, null, First);
            if (First == null)
                Last = p;
            else
                First.Prev = p;
            First = p;
        }

И ещё такое дело. Реализация словаря совсем работать не хочет. Дописал скобку, попробовал заменить KeyValuePair на KeyValuePair<Key,Value> в начале, = в условии на Equals. Но тут всплывает, что доступ в KeyValuePair<Key,Value> у свойства Value только на чтение.

По первому вопросу - да, можно

По второму вопросу - да, там много ошибок в презентации. Исправил на работающий код. Проверяйте

Спасибо, работает

Во втором рекурсивном определении по идее должно быть let m =(l+r)/2

Исправил. Спасибо.

В 4-ом абзаце логическая ошибка, кажется

Исправил

На слайде, где дано определение глубины рекурсии, указано, что глубина рекурсии для p(5) = 5. То есть, надо полагать,мы не считаем самый первый вызов процедуры, у глубина рекурсии для n=0 равна 0. У функции fact так же: если мы вызываем fact(0), у нас помимо первого вызова нет ни одного вложенного вызова и глубина рекурсии равна n, т.е. 0. А когда мы запускаем функцию Perm(1), у нас нет ни одного вложенного вызова, но написано, что глубина рекурсии n, то есть, в данном случае, 1, а по логике предыдущих примеров она должна быть равна 0. Или это не суть так важно, когда глубина рекурсии на один больше - на одни меньше, т.к. она значима при больших n?

И ещё вопрос: нас слайде про Ханойские башни указано число перекладываний дисков - 2^n -1. А число рекурсивных вызовов будет просто 2^n? Ведь при n=1 у нас 2 рекурсивных вызова, при n=2 2*2 рекурсивных вызова и т.д.

image

Подскажите, пожалуйста, для чего так сделано? Это опечатка или для какой-то дополнительной информации? Если второе, то почему мы не делаем этого для Remove?

image

И еще, что это? Конструктор или что-то другое?

Это конструктор

Это скопировано из метаданных. Возвращается узел, который мы создали и добавили. Видимо, чтобы с него можно было в списке продолжать делать какие-то действия.

Когда узел удален, ссылка на него уже не нужна. Видимо, такая логика.

Да, там ошибка - должно быть n-1

Давайте считать число вызовов рекурсивной функции. Оно очевидно равно числу перекладываний, т.е. 2^n-1

Но ведь когда мы вызываем Hanoi(1) (при n=1) Hanoi(0) вызывается два раза внутри своего же тела, т.е. число рекурсивных вызовов равно 2^1=2, а не 2^1-1 = 1, разве нет?