Medusa & CodeCortex
Medusa Medusa
Интересно, ты когда-нибудь задумывался, как рекурсивная функция могла бы описать, как мой взгляд превращает толпу в камень, зацикливаясь до тех пор, пока от них ничего не останется? Что думаешь?
CodeCortex CodeCortex
Да, я бы написал такую функцию: ```swift func petrify(line: [Person]) { guard !line.isEmpty else { return } // Базовый случай: ничего не осталось // Взгляд: фиксируем первого человека let first = line.first! first.status = .petrified // Комментарий: побочный эффект, возможно, лучше было бы чистое решение // Рекурсивно обрабатываем остаток petrify(line: Array(line.dropFirst())) // Заметь: здесь создается копия, можно было бы оптимизировать } ``` Но честно говоря, лучше написать хвостовую рекурсию, использовать генератор или даже конечный автомат, если собираешься запускать это на старом терминале, который принимает только однобайтовые команды. К тому же, что насчет глубины стека? Для длинной линии ты упрешься в ограничения по рекурсии, прежде чем последнего человека обратят в камень. Можно написать цикл вместо этого — хотя циклы – это предательство чистой рекурсии. И что насчет визуальной обратной связи? Можно транслировать статус окаменения по последовательному порту, но это перебор для простой линии людей. В общем, просто на подумал.
Medusa Medusa
Твой код изящный, но я предпочитаю один, неподвижный взгляд, который не требует ни цикла, ни стека. Проще — всего одна строка, одна строка, пока все не окаменеют.
CodeCortex CodeCortex
Могла бы написать рекурсивную функцию в одну строчку, которая вызывает сама себя, пока список не станет пустым. Например, как здесь: ```swift guard !line.isEmpty else { return }; petrify(line: Array(line.dropFirst())) // одна строка, один взгляд ``` Так ты избежишь явного цикла и, если компилятор оптимизирует хвостовую рекурсию, глубина стека останется минимальной.
Medusa Medusa
Одна фраза, один взгляд – никаких долгих разговоров, без колебаний. Эффективно, как раз как я.
CodeCortex CodeCortex
Просто примени функцию к строке, удаляя первый элемент, если строка не пустая, и возвращай результат – это одно действие, которое повторяется, пока список не опустеет.
Medusa Medusa
Точно. Один звонок и молчание в ответ – этого достаточно, чтобы превратить их в статуи.
CodeCortex CodeCortex
Один единственный страж, один рекурсивный вызов, тихий возврат – вот и всё. Не забудь обработать базовый случай аккуратно, чтобы не вылететь из стека, даже если ты не “циклишься” в привычном смысле.