← All posts tagged Erlang

GunnerKade
Erlang CS olymp В продолжение вопроса о косвенной рекурсии (#790719). Нашел задачу, которую без такой рекурсии было бы весьма проблематично решить. Собственно задача:
"Строка состоит из клеток, пронумерованных от 1 до n. Состояние клетки можно изменить — если она пуста, поставить в нее шашку (занять ее), иначе убрать из нее шашку (освободить ее). Вначале строка пуста. Нужно занять все клетки, соблюдая следующее правило. Изменение клетки допустимо, если она имеет номер 1 или расположена непосредственно после занятой клетки, имеющей минимальный номер среди занятых клеток."
На входе целое n, на выходе — последовательность состояний строки клеток от начального — [0,0,...,0], когда все клетки свободны, до конечного [1,1,...,1] — все заняты.
Выражаем друг через друга такие подзадачи, как
1) добавление единицы в конец последовательности единиц ([1,1,1,0] -> [1,1,1,1]) ;
2) обратная операция — удаление единицы ([1,1,1,1] -> [1,1,1,0]) ;
3) получение последовательности единиц из последовательности нулей ([0,0,0,0] -> [1,1,1,1]) ;
4) подзадача 3) наоборот ([1,1,1,1] -> [0,0,0,0]).
В итоге получаем то, что нужно.
Задача взята из книги ozon.ru (стр. 83). Решение там предложено слегка другое, но мне нравится мое из-за его симметричности. Код на эрланге pastebin.com
Осталось найти реальное применение двойной рекурсии.
GunnerKade
? Erlang Как найти в списке записей нужную по двум и более ключам?
-record(rec, {p1,p2,p3}).
L = [#rec{p1=1,p2=2,p3=3}, #rec{p1=1,p2=20,p3=30}, #rec{p1=2,p2=2,p3=300}].Вобщем, надо красиво найти запись с p1=1, p2=2.
В случае с одним ключом, можно было бы воспользоваться lists:keysearch.
С двумя и более можно использовать list comprehension, вот я и думаю, есть ли способ сделать это проще.