Как сделать рекурсию в фотошопе

Обновлено: 07.07.2024

Бесконечная рекурсия. Эффект Дросте

В сегодняшней подборке посмотрим на 33 вдохновляющих язображения с Эффектом Дросте (Droste effect). Большинство из них были созданы с помощью Photoshop, они требуют большого мастерства и кажутся немного хитрым в получении этого эффекта. После небольшой практики и преданности делу вы должны узнать, как создать Эффект Дросте (Droste effect), используя Photoshop.

Что такое Эффект Дросте (Droste effect)?

Бесконечная рекурсия или Эффект Дросте - это голландский термин, которым обозначают особый вид рекурсивного изображения. Данный термин появился в 1904 году после публикации подобного изображения на пакете какао Droste. Эффект рекурсии достигается таким образом: на фотографии размещается уменьшенный вариант той же фотографии или объекта с этой фотографии, на уменьшенной копии размещается ещё более уменьшенная фотография и так далее. Такой процесс может быть продлён до бесконечности, что и кажется зрителю, который посредством эффекта Дросте улетает в бесконечную даль. Зрителю не кажется, что эта фотография или картина плоская, теперь она стала бесконечно глубокая. Бесконечность ограничивается разрешением фотографии, то есть последняя уменьшенная копия будет иметь размер 1 пиксель и дальнейшее размещение станет невозможным.

Знаменитыми фотохудожниками в стиле рекурсии являются Мауриц Эшер, Джош Соммерс. Джотто ди Бондоне (1267-1337г.г.) – итальянский художник, оказывается первый, кто нарисовал подобную картину. Итальянский художник изобразил рекурсию в триптихе Стефанески. Эффект Дросте с научной точки зрения относится к фрактальной геометрии и его можно рассчитать с помощью специальных формул. Изображение в этом стиле вовсе не являются простым и элементарным. Чтобы правильно рассчитать положение, размеры уменьшенных копий и перспективу положения многие художники и фотохудожники по несколько месяцев только изучают основы рекурсии. Зато, после всех мучений получаются вот такие красивые вещи, которые стоили тех трудностей, через которые прошли авторы работ в стиле рекурсии Дросте.

Как этот эффект получил свое название?

Эффект Дросте (нидерл. Droste-effect) — рекурсивное изображение как частный случай техники mise en abîme. Термин ввёл спортивный журналист-комментатор, поэт, переводчик Нико Схепмакер (нидерл. Nico Scheepmaker) в конце 70-х годов XX века по названию голландской марки какао Droste (плакат на котором изображена медсестра с подносом, с чашкой горячего шоколада и коробкой с тем же изображением. Этот образ, введенный в 1904 году и поддерживается в течение десятилетий с небольшими вариациями, стал бытовым понятием.), которая использовала этот эффект в своей рекламе. Сам эффект известен давно. Например, Джотто применил его в триптихе Стефанески (начало XIV века). Часто встречается в массовой культуре (пример — обложка альбома Ummagumma (1969) группы Pink Floyd).






effect_droste

Многие же из Вас видели подобные фотографии,и я не исключение,и мне также интересно было знать,как сделать подобный эффект.

Информации на эту тему в принципе много,но вот способ реализации мне не понравился,дело в том,что все уроки написаны для связки GIMP+плагин MathMap,меня такой вариант не устраивает,так как не признаю ГИМП,да и не хотелось мне его скачивать ради того,чтобы сделать,ну максимум пару-тройку картинок.И решение конечно же было мной найдено,причём случайно.Ещё с прошлого года у меня есть программа MediaChance Photo-Brush,на неё у меня есть кое-какие планы (в плане уроков и обучения),программа очень качественная,впрочем как и все продукты MediaChance,в дальнейшем я планирую выложить уроки по этой проге.И вот,оказалось,что эта прога умеет делать этот эффект,чему я даже обрадовался.Теперь и Вам покажу,как это делается.Всего нам потребуется буквально пару кликов мышкой.

Скажу честно,пока у меня нет особо времени для экспериментов с этой прогой,поэтому я использую фотографию,которая уж точно подойдёт для Эффекта Дросте,Вы же можете поэкспериментировать с разными,думаю всё должно получиться.

Теперь меню Adjust-Fractal Droste,появится окно эффекта,всё что дальше делать,является лишь методом проб и ошибок,какой-то конкретной настройки нет,поэтому крутите-вертите ползунки для достижения результата,который удовлетворит.

Эффективная обработка фотографий в Photoshop

Читая статьи о Photoshop, я часто удивляюсь тому, насколько многие авторы усложняют решение по сути простых задач по обработке. Этим страдают и многие «монументальные» писатели, например Дэн Маргулис. Но ему это простительно – его задача написать о всех тонкостях и нюансах процесса обработки, рассмотреть его со всех ракурсов и сторон. Хотя именно эта особенность подачи материала в его книгах отталкивает многих читателей.

На самом деле, корни подобных способов «увеличить резкость в 40 действий» растут из очень простой вещи – люди, которые пишут эти уроки, никогда не работали с большим объемом фотографий. То есть, как правило, у них есть пара фотографий и они готовы в процессе их обработки убить вечер-другой. Но когда у тебя идут постоянные заказы, и с каждой фотосессии тебе надо серьезно обработать несколько десятков кадров – начинаешь задумываться о более простых и удобных способах обработки.

О них мы сегодня и поговорим. Я расскажу вам о пяти простых, но очень эффективных инструментах Photoshop, которые я постоянно использую в своей работе.

Перед тем, как обрабатывать фотографии в Photoshop, я всегда сначала работаю с кадрами в RAW-конвертере. Именно там я провожу основную цветокоррекцию и первичную обработку фотографий. По сути, я создаю «скелет» обработки, а в Photoshop работаю уже с деталями фотографии.

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

1. Dodge Tool/Burn Tool

Главная функция Dodge Tool/Burn Tool – осветление/затемнение отдельных участков изображения. По сути, вы можете «рисовать» затемнение или наоборот – осветлять снимок. Это очень просто, попробуйте: уверен, вы оцените этот инструмент. Dodge/Burn Tool имеет всего две, но очень важные настройки.

Range

Range — Выбор области применения

Вы можете использовать этот инструмент на темные (Shadows), светлые (Highlights) или нейтральные (Midtones) области фотографии. Например, вам нужно осветлить темные участки подбородка (при обработке портрета), а светлые оставить не тронутыми. В таком случае мы ставим режим Shadows в Dodge Tool, и она будет осветлять только темные участки мест, на которые мы ее применим.

Exposure

Exposure – сила воздействия

Очень важно правильно выставить силу воздействия. Многие люди, экспериментируя с фотошопом, пробуют Dodge/Burn на 100%. И, затемняя изображение, получают черные «дыры», а осветляя – сплошные пересветы. Конечно, получая такой результат, они больше не возвращаются к этому инструменту. Но Dodge/Burn – это тонкий инструмент. Если вы работаете по теням или светам – попробуйте силу применения в 7-10%, если с нейтральными участками – 10-20%. Для каждого случая сила воздействия подбирается отдельно, но, немного поработав с этим инструментом, вы начнете чувствовать, какая именно мощность нужна в каждом конкретном случае.

Использование

Dodge/Burn имеет массу способов применения:

  • Осветляйте радужку глаз
  • Затемняйте линии формы лица на мужском портрете
  • Осветляйте области контрового света
  • Отбеливайте зубы вашим моделям

Именно используя Dodge Tool, проще и эффективнее всего отбеливать зубы на фотографии. Немного попозже я обязательно напишу отдельный урок о правильном отбеливании зубов с помошью Dogde Tool.

2. Clone Stamp

В фотошопе существует несколько инструментов для ретуши изображений, и каждый из них по своему хорош. Но «Штамп» — самый универсальный в применении инструмент.

Его функция – брать определенный участок изображения и копировать его. Тем самым мы можем, например, заретушировать морщины – просто «заменив» их участками гладкой кожи. Для этого нажимаем Alt и выбираем область, откуда будет браться картинка, и потом, просто кликая по нужным участкам изображения, мы будем копировать ее на них.

В настройках штампа важно обратить внимание на два параметра:

Mode

Это режимы, в которых будет работать штамп. Например, в режиме Darken штамп будет «заменять» только более светлые зоны, нежели выбранный участок. По сути – вы можете затемнять светлые зоны изображения, оттого и название режима – Darken. И, сооветственно, в режиме Lighten штамп будет работать только на более темные зоны изображения, осветляя их.

Clone Stamp имеет много режимов работы – поэкспериментируйте с ними, уверен, вы получите интересные результаты.
Описывать работу каждого режима, на мой взгляд, не имеет смысла — в фотошопе для всех инструментов действуют по сути одни и теже принципы работы режимов, только немного изменяясь под специфику конкретного инструмента.

Opacity

Эффективная обработка фотографий в Photoshop

Opacity – значит непрозрачность. Проще говоря, чем меньше вы поставите процент в этой настройке, тем более прозрачная будет «работа» штампа. Например, при 100% штамп полностью заменит выбранный участок, а при 50% — будет полупрозрачным. Для ретуши лица, как правило, используется 10-30%, в ином случае будет слишком четко виден след штампа.

Использование Clone Stamp

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

Эффективная обработка фотографий в Photoshop

Также можно заретушировать, например, нежелательный объект в кадре. Если, конечно, он не занимает половину фотографии.

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

3. History Brush

Эффективная обработка фотографий в Photoshop

Хистори браш – это машина времени для обработки фотографий. Вы можете брать любую стадию обработки и кисточкой рисовать из нее по вашему изображению.

History Brush таит в себе огромные возможности. Подробно о работе этого инструмента я уже писал в отдельной статье. В ней вы найдете подробный урок по применению хистори браш и узнаете, как увеличивать резкость только на нужных вам участках изображения.

Безусловно, увеличение резкости не единственная область ее применения. В будущих статьях, я расскажу, как с помощью History Brush работать с цветом на фотографии.

4. Black&White

Инструмент Black&White находится во вкладке Image-->Adjustments. Или можно просто создать Adjustment layer (Корректирующий слой) на фотографии.

Эффективная обработка фотографий в Photoshop

Главная функция инструмента Black&White – «правильный» перевод цветного изображения в ч/б. Правильный потому, что вы можете изменять черно-белое отображение каждого из цветов. Тем самым вы сможете получить красивую и «вкусную» ч/б картинку.

Эффективная обработка фотографий в Photoshop

Но на этом функционал B&W не ограничивается.

С помощью этого инструмента можно получить очень интересную и цветную картинку. Применим на нашу картинку B&W, а затем включим режим слоя Overlay.

Теперь, манипулируя рычажками управления B&W и прозрачностью слоя, мы можем получить очень интересную картинку. Для большей наглядности я поставил довольно высокий Opacity слоя с B&W — 62% и повернул на максимум рычажки Greens, Cyans, Blues и Magentas.

Как мы видим, картинка стала сразу насыщеннее и контрастнее (кликните по картинке для увеличения).

Эффективная обработка фотографий в Photoshop

А теперь обратим внимание на галочку Tint. Включив ее, мы сможем тонировать изображение в нужный нам цвет.

Эффективная обработка фотографий в Photoshop

Использование

Вариантов использования B&W как при работе с цветом, так и при обработке Ч/Б — масса.
В одной из следующих статей я, на примере обработки нескольких фотографий, расскажу о всех основных нюансах работы с Black&White.

5. Shadow/Highlights

Эффективная обработка фотографий в Photoshop

Shadow/Highlights также находится во вкладке Image-->Adjustments (там вообще, кстати, много интересных инструментов находится, советую поэкспериментировать со всеми)

Этот инструмент создан, чтобы затемнять пересвеченые области и вытягивать света из теней. Кроме самого очевидного применения – устранять пересветы и недосветы, S/H отлично работает также и для создания ощущения большей глубины картинки. Мы можем в светлые области добавить темных полутонов, а в темные – светлых. Тем самым, картинка станет более объемной и глубокой.

Например, на этой фотографии с помощью S/H я добавил объема шерсти щенка и картинка сразу стала интересней.

Эффективная обработка фотографий в Photoshop

На самом деле, Shadow/Highlights — совершенно незаменимый инструмент для любой серьезной обработки. Практически любую фотографию можно сделать лучше, если грамотно применить S/H.

Хочется рассказать о всех настройках S/H и его функционале, но это действительно тема для отдельной статьи. В будущем, я обязательно вернусь к теме Shadow/Highlights, а пока просто попробуйте поэкспериментировать — пробуйте разные варианты настроек и смотрите на результат. По моему опыту, этот способ — самых действенный для освоения новых вещей.

Как мы видим, все эти инструменты очень просты в использовании, но при этом – потрясающе эффективны. Попробуйте поэкспериментировать с ними и вы почувствуете сколько возможностей они дают при обработке.

Думаю стоит сделать серию статей о простых, но очень эффективных инструментах в Photoshop. И в следующей статье я расскажу об инструментах для серьезной работы с цветом на фотографии.

image

В этой статье речь пойдет о задачах на рекурсию и о том как их решать.

Кратко о рекурсии

Рекурсия достаточно распространённое явление, которое встречается не только в областях науки, но и в повседневной жизни. Например, эффект Дросте, треугольник Серпинского и т. д. Один из вариантов увидеть рекурсию – это навести Web-камеру на экран монитора компьютера, естественно, предварительно её включив. Таким образом, камера будет записывать изображение экрана компьютера, и выводить его же на этот экран, получится что-то вроде замкнутого цикла. В итоге мы будем наблюдать нечто похожее на тоннель.

В программировании рекурсия тесно связана с функциями, точнее именно благодаря функциям в программировании существует такое понятие как рекурсия или рекурсивная функция. Простыми словами, рекурсия – определение части функции (метода) через саму себя, то есть это функция, которая вызывает саму себя, непосредственно (в своём теле) или косвенно (через другую функцию).

Задачи

При изучении рекурсии наиболее эффективным для понимания рекурсии является решение задач.

Как же решать задачи на рекурсию ?

В первую очередь надо понимать что рекурсия это своего рода перебор. Вообще говоря, всё то, что решается итеративно можно решить рекурсивно, то есть с использованием рекурсивной функции.

Любой алгоритм, реализованный в рекурсивной форме, может быть переписан в итерационном виде и наоборот. Останется вопрос, надо ли это, и насколько это будет это эффективно.

Для обоснования можно привести такие доводы.

Для начала можно вспомнить определение рекурсии и итерации. Рекурсия — это такой способ организации обработки данных, при котором программа вызывает сама себя непосредственно, либо с помощью других программ. Итерация — это способ организации обработки данных, при котором определенные действия повторяются многократно, не приводя при этом к рекурсивным вызовам программ.

После чего можно сделать вывод, что они взаимно заменимы, но не всегда с одинаковыми затратами по ресурсам и скорости. Для обоснования можно привести такой пример: имеется функция, в которой для организации некого алгоритма имеется цикл, выполняющий последовательность действий в зависимости от текущего значения счетчика (может от него и не зависеть). Раз имеется цикл, значит, в теле повторяется последовательность действий — итерации цикла. Можно вынести операции в отдельную подпрограмму и передавать ей значение счетчика, если таковое есть. По завершению выполнения подпрограммы мы проверяем условия выполнения цикла, и если оно верно, переходим к новому вызову подпрограммы, если ложно — завершаем выполнение. Т.к. все содержание цикла мы поместили в подпрограмму, значит, условие на выполнение цикла помещено также в подпрограмму, и получить его можно через возвращающее значение функции, параметры передающееся по ссылке или указателю в подпрограмму, а также глобальные переменные. Далее легко показать, что вызов данной подпрограммы из цикла легко переделать на вызов, или не вызов (возврата значения или просто завершения работы) подпрограммы из нее самой, руководствуясь какими-либо условиями (теми, что раньше были в условии цикла). Теперь, если посмотреть на нашу абстрактную программу, она примерно выглядит как передача значений подпрограмме и их использование, которые изменит подпрограмма по завершению, т.е. мы заменили итеративный цикл на рекурсивный вызов подпрограммы для решения данного алгоритма.

Задача по приведению рекурсии к итеративному подходу симметрична.

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

Более подробно с этим можно познакомиться тут

Так же как и у перебора (цикла) у рекурсии должно быть условие остановки — Базовый случай (иначе также как и цикл рекурсия будет работать вечно — infinite). Это условие и является тем случаем к которому рекурсия идет (шаг рекурсии). При каждом шаге вызывается рекурсивная функция до тех пор пока при следующем вызове не сработает базовое условие и произойдет остановка рекурсии(а точнее возврат к последнему вызову функции). Всё решение сводится к решению базового случая. В случае, когда рекурсивная функция вызывается для решения сложной задачи (не базового случая) выполняется некоторое количество рекурсивных вызовов или шагов, с целью сведения задачи к более простой. И так до тех пор пока не получим базовое решение.

  • Условие остановки или же Базовый случай
  • Условие продолжения или Шаг рекурсии — способ сведения задачи к более простым.

Тут Базовым условием является условие когда n=1. Так как мы знаем что 1!=1 и для вычисления 1! нам ни чего не нужно. Чтобы вычислить 2! мы можем использовать 1!, т.е. 2!=1!*2. Чтобы вычислить 3! нам нужно 2!*3… Чтобы вычислить n! нам нужно (n-1)!*n. Это и является шагом рекурсии. Иными словами, чтобы получить значение факториала от числа n, достаточно умножить на n значение факториала от предыдущего числа.

В сети при обьяснении рекурсии также даются задачи нахождения чисел Фибоначчи и Ханойская башня

Рассмотрим же теперь задачи с различным уровнем сложности.
Попробуйте их решить самостоятельно используя метод описанный выше. При решении попробуйте думать рекурсивно. Какой базовый случай в задаче? Какой Шаг рекурсии или рекурсивное условие?

Поехали! Решения задач предоставлены на языке Java.

A: От 1 до n
Дано натуральное число n. Выведите все числа от 1 до n.


B: От A до B
Даны два целых числа A и В (каждое в отдельной строке). Выведите все числа от A до B включительно, в порядке возрастания, если A < B, или в порядке убывания в противном случае.

image


C: Функция Аккермана
В теории вычислимости важную роль играет функция Аккермана A(m,n), определенная следующим образом:

Даны два целых неотрицательных числа m и n, каждое в отдельной строке. Выведите A(m,n).

D: Точная степень двойки
Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае.
Операцией возведения в степень пользоваться нельзя!

E: Сумма цифр числа
Дано натуральное число N. Вычислите сумму его цифр.
При решении этой задачи нельзя использовать строки, списки, массивы (ну и циклы, разумеется).

F: Цифры числа справа налево
Дано натуральное число N. Выведите все его цифры по одной, в обратном порядке, разделяя их пробелами или новыми строками.
При решении этой задачи нельзя использовать строки, списки, массивы (ну и циклы, разумеется). Разрешена только рекурсия и целочисленная арифметика.

G: Цифры числа слева направо
Дано натуральное число N. Выведите все его цифры по одной, в обычном порядке, разделяя их пробелами или новыми строками.
При решении этой задачи нельзя использовать строки, списки, массивы (ну и циклы, разумеется). Разрешена только рекурсия и целочисленная арифметика.

H: Проверка числа на простоту
Дано натуральное число n>1. Проверьте, является ли оно простым. Программа должна вывести слово YES, если число простое и NO, если число составное. Алгоритм должен иметь сложность O(logn).
Указание. Понятно, что задача сама по себе нерекурсивна, т.к. проверка числа n на простоту никак не сводится к проверке на простоту меньших чисел. Поэтому нужно сделать еще один параметр рекурсии: делитель числа, и именно по этому параметру и делать рекурсию.

I: Разложение на множители
Дано натуральное число n>1. Выведите все простые множители этого числа в порядке неубывания с учетом кратности. Алгоритм должен иметь сложность O(logn).

J: Палиндром
Дано слово, состоящее только из строчных латинских букв. Проверьте, является ли это слово палиндромом. Выведите YES или NO.
При решении этой задачи нельзя пользоваться циклами, в решениях на питоне нельзя использовать срезы с шагом, отличным от 1.

K: Вывести нечетные числа последовательности
Дана последовательность натуральных чисел (одно число в строке), завершающаяся числом 0. Выведите все нечетные числа из этой последовательности, сохраняя их порядок.
В этой задаче нельзя использовать глобальные переменные и передавать какие-либо параметры в рекурсивную функцию. Функция получает данные, считывая их с клавиатуры. Функция не возвращает значение, а сразу же выводит результат на экран. Основная программа должна состоять только из вызова этой функции.

L: Вывести члены последовательности с нечетными номерами
Дана последовательность натуральных чисел (одно число в строке), завершающаяся числом 0. Выведите первое, третье, пятое и т.д. из введенных чисел. Завершающий ноль выводить не надо.
В этой задаче нельзя использовать глобальные переменные и передавать какие-либо параметры в рекурсивную функцию. Функция получает данные, считывая их с клавиатуры. Функция не возвращает значение, а сразу же выводит результат на экран. Основная программа должна состоять только из вызова этой функции.

M: Максимум последовательности
Дана последовательность натуральных чисел (одно число в строке), завершающаяся числом 0. Определите наибольшее значение числа в этой последовательности.
В этой задаче нельзя использовать глобальные переменные и передавать какие-либо параметры в рекурсивную функцию. Функция получает данные, считывая их с клавиатуры. Функция возвращает единственное значение: максимум считанной последовательности. Гарантируется, что последовательность содержит хотя бы одно число (кроме нуля).

N: Среднее значение последовательности
Дана последовательность натуральных чисел (одно число в строке), завершающаяся числом 0. Определите среднее значение элементов этой последовательности (без учета последнего нуля).
В этой задаче нельзя использовать глобальные переменные. Функция получает данные, считывая их с клавиатуры, а не получая их в виде параметра. В программе на языке Python функция возвращает кортеж из пары чисел: число элементов в последовательности и их сумма. В программе на языке C++ результат записывается в две переменные, которые передаются в функцию по ссылке.
Гарантируется, что последовательность содержит хотя бы одно число (кроме нуля).

O: Второй максимум
Дана последовательность натуральных чисел (одно число в строке), завершающаяся числом 0. Определите значение второго по величине элемента в этой последовательности, то есть элемента, который будет наибольшим, если из последовательности удалить наибольший элемент.
В этой задаче нельзя использовать глобальные переменные. Функция получает данные, считывая их с клавиатуры, а не получая их в виде параметра. В программе на языке Python функция возвращает результат в виде кортежа из нескольких чисел и функция вообще не получает никаких параметров. В программе на языке C++ результат записывается в переменные, которые передаются в функцию по ссылке. Других параметров, кроме как используемых для возврата значения, функция не получает.
Гарантируется, что последовательность содержит хотя бы два числа (кроме нуля).

P: Количество элементов, равных максимуму
Дана последовательность натуральных чисел (одно число в строке), завершающаяся числом 0. Определите, какое количество элементов этой последовательности, равны ее наибольшему элементу.
В этой задаче нельзя использовать глобальные переменные. Функция получает данные, считывая их с клавиатуры, а не получая их в виде параметра. В программе на языке Python функция возвращает результат в виде кортежа из нескольких чисел и функция вообще не получает никаких параметров. В программе на языке C++ результат записывается в переменные, которые передаются в функцию по ссылке. Других параметров, кроме как используемых для возврата значения, функция не получает.
Гарантируется, что последовательность содержит хотя бы одно число (кроме нуля).

Q: Количество единиц
Дана последовательность натуральных чисел (одно число в строке), завершающаяся двумя числами 0 подряд. Определите, сколько раз в этой последовательности встречается число 1. Числа, идущие после двух нулей, необходимо игнорировать.
В этой задаче нельзя использовать глобальные переменные и параметры, передаваемые в функцию. Функция получает данные, считывая их с клавиатуры, а не получая их в виде параметров.

R: Треугольная последовательность
Дана монотонная последовательность, в которой каждое натуральное число k встречается ровно k раз: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4,…
По данному натуральному n выведите первые n членов этой последовательности. Попробуйте обойтись только одним циклом for.

S: Заданная сумма цифр
Даны натуральные числа k и s. Определите, сколько существует k-значных натуральных чисел, сумма цифр которых равна d. Запись натурального числа не может начинаться с цифры 0.
В этой задаче можно использовать цикл для перебора всех цифр, стоящих на какой-либо позиции.

T: Без двух нулей
Даны числа a и b. Определите, сколько существует последовательностей из a нулей и b единиц, в которых никакие два нуля не стоят рядом.

U: Разворот числа
Дано число n, десятичная запись которого не содержит нулей. Получите число, записанное теми же цифрами, но в противоположном порядке.
При решении этой задачи нельзя использовать циклы, строки, списки, массивы, разрешается только рекурсия и целочисленная арифметика.
Фунция должна возвращать целое число, являющееся результатом работы программы, выводить число по одной цифре нельзя.
Update от Eivind

Вот и все. Надеюсь решение задач принесло вам столько же удовольствия сколько и мне!

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

Читайте также: