Привет и добрый день, я вернулся после короткого перерыва в программировании и длительного перерыва в ведении блога!

В последнее время я немного пренебрегал этим блогом. В октябре я провел две недели, полностью отключившись от мира, совершая поездку по Шотландии North Coast 500 (10/10, вы должны ехать). К сожалению, это не блог о путешествиях, поэтому поищите его. После этого у меня была еще одна неделя, чтобы разобраться в некоторых жизненных вещах, и с середины октября я прохожу второй курс из серии Дизайн программного обеспечения: Как кодировать сложные данные.

Мы снова рады тому, что профессор Кицалес из UBC ведет путь с того места, на котором он остановился на предыдущем курсе. Он нарастает довольно быстро. Первый модуль посвящен деревьям произвольной арности, если вы боролись с деревьями двоичного поиска, как я, о, вас ждет удовольствие. Подумайте о генеалогическом дереве, у каждого члена может быть любое количество детей, а в двоичном дереве каждый узел может иметь максимум два. Этот тип данных вводит взаимную ссылку и поиск с возвратом. Шаблоны взаимных ссылок необходимы, когда тип данных содержит список одного и того же типа, поэтому требуются две функции: первая работает с типом данных, а вторая работает с типом данных listof. Это звучит запутанно, но если вы будете следовать шаблону, взаимная рекурсия исчезнет. Мой первый большой урок заключался в том, чтобы отслеживать, какие типы данных производятся какими функциями даже в рамках рекурсии, потому что все может усложняться.

Следующий модуль был посвящен 2-One-Of, что означает разработку функции, которая использует 2 типа данных, и каждый тип данных является «одним из». Так что, возможно, он потребляет список имен и список чисел, но это может быть что угодно. Для этого вам необходимо физически записать «таблицу перекрестного произведения» ваших опций, чтобы сгенерировать логику ваших условных операторов. Например: что вы делаете, если первый список пуст, а второй - пуст? Что первый список не пуст, а второй список пуст? Рисование пером + бумагой позволяет увидеть, как можно закрепить эту функцию.

Модуль 8b представляет новую языковую функцию под названием Local, которая позволяет вам устанавливать небольшие определения внутри самих функций. Это супер мощная возможность избежать повторных вычислений и упростить рекурсию. Может быть немного сложно отслеживать, когда вы получаете локальный объект в локальном, поэтому я предпочитаю оставлять комментарии сбоку от каждой функции. На данный момент для локального определения мы прекратили полные тесты и процесс HtDF. Здесь я начал ошибаться.

Модуль 9 по абстракции был пока самым сложным. Если вы знакомы с JavaScript map, filter, forEach и т. Д., Это поможет. Абстракция это все еще ДЕЙСТВИТЕЛЬНО ТРУДНО. Для абстрактного мышления требуется разблокировать новую часть вашего мозга. Я все еще пишу функции, которые работают со списками традиционным способом, вместо того, чтобы писать абстрактные функции. Мне нужно продолжать практику.

Последний модуль, до которого я дошел, относится к генеративной рекурсии (замечательно) и поиску (ужасно). Генеративная рекурсия позволяет вам определять свои собственные правила рекурсии для создания таких вещей, как фракталы или последовательность Коллатца. Чтобы решить проблемы, требовалось немного геометрии или хотя бы размещение изображений. Модуль поиска зациклился на создании решателя судоку методом перебора. Множество абстрактных функций, смешивания шаблонов и локальных определений. На этом этапе я собираюсь просмотреть весь курс, прежде чем пытаться пройти тест. Иногда нужно двигаться назад, чтобы двигаться вперед. Для всех, кто не прошел курс: решатель судоку ДЕЙСТВИТЕЛЬНО ТРУДНЫЙ, и не волнуйтесь, если вы не можете написать его самостоятельно.

Спасибо, что прочитали, до следующего раза!