Новое в схеме / ракетке: интенсивное использование рекурсии в образе жизни или я просто прохожу типичную фазу - PullRequest
5 голосов
/ 26 января 2012

Последние несколько месяцев я бегал по функциональным языкам от F # до Haskell и Scheme (Racket). Я никогда особо не использовал рекурсию, но Haskell и его сопоставление с образцом действительно помогли мне меньше бояться их. Теперь, когда я использую Scheme, мне кажется, что по умолчанию используются рекурсивные методы. Мне любопытно, если это свидетельствует о том, чтобы просто пройти через "ооо блестящий!" фаза или если рекурсия является одним из основных элементов разработки Схемы.

Примечание: я стрелял по хвостовой рекурсии, когда пишу рекурсивные методы.

Ответы [ 3 ]

10 голосов
/ 26 января 2012

Я думаю, это зависит от того, о какой рекурсии вы говорите.

Первое, что открывает глаза (например, если вы работаете через SICP), это то, что итерация может быть заменена рекурсией. Все эти утомительные и подверженные ошибкам циклические коды, которые вы написали в прошлой жизни, могут быть выполнены другим способом. Это круто и (как ты выразился) "о, блестящий!" опыт.

Следующим откровением является то, как мало этого рекурсивного кода, который вы действительно будете писать в реальной жизни. Вместо этого вы избежите утомительной итерации - и утомительной рекурсии, обе - используя строительные блоки, такие как map и fold.

Кроме того, в Racket вы, вероятно, закончите от map и fold до предпочтения "пониманий", таких как for/list, for/vector и for/fold, которые работают с последовательностями, а не просто списками. По пищевой цепочке ты продолжаешь идти.

Сказав это, есть некоторые проблемы, которые вы лучше всего решите рекурсивно (не просто "итерация другими средствами"). И уровень комфорта, который вы получили в откровении номер один, поможет мне, я думаю.

5 голосов
/ 26 января 2012

Нет, это не фаза, это основной продукт.Рекурсия - это метод, который позволяет вам решать более сложные задачи, чем вы могли бы легко решить, и даже в тех случаях, когда вы хотите итеративное решение, легче прийти к нему, если вы впервые сформулируете рекурсивное решение.

Освоение рекурсии также открывает новые проблемные области для вас.Типичные итеративные программисты не способны решать проблемы, которые, например, включают манипулирование и перевод между формальными языками, например, написание сложных генераторов SQL-запросов на основе кодированного описания отчета.пользователь хочет видеть.

Если вы хотите двигаться вперед, вам следует лучше освоиться со сгибами, которые абстрагируются от явной рекурсии, отделяя рекурсивную структуру вычисления от содержимого рекурсивных шагов.Так, например, fold-right Схемы можно рассматривать как «выполнить рекурсивное вычисление, которое имеет ту же форму, что и этот список, отображая пустой список в это значение как базовый случай, а каждый cons - в эту функцию».Затем складываются другие, более сложные структуры данных.

3 голосов
/ 26 января 2012

Это немного каждого.Рекурсия является основным продуктом Лиспа в целом (не только Схема).Однако более продвинутые пользователи чаще используют другие примитивы потока управления (хотя они, в свою очередь, могут быть реализованы рекурсивно).

...