Путь разработчика    

Рекурсивно решить проблему Башни Ханоя в C#

Рекомендуем: Как открутить болт-секретку на колесе авто без специального ключа
eda2480d

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

Проблема Башни Ханоя имеет хорошее, естественно рекурсивное решение.

Рассмотрим три оранжевые штифты, показанные на рисунке. Цель состоит в том, чтобы переместить кучу зеленых дисков из левого колышка в другой (скажем, средний колышек). Вы можете перемещать только один диск за раз, и вы никогда не сможете разместить большой диск на меньшем диске.

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

Если это слишком запутанно, рассмотрите меньшую проблему только с двумя дисками. Чтобы переместить их слева направо, сначала переместите верхний диск вправо. Затем переместите нижний диск в средний штифт. Наконец, переместите верхний диск в средний колышек. Запустите программу несколько раз, чтобы увидеть, как она работает для большей проблемы. Вы можете отрегулировать константу Delay в коде, чтобы программа работала медленнее или быстрее.

Если это слишком запутанно, рассмотрите меньшую проблему только с двумя дисками. Чтобы переместить их слева направо, сначала переместите верхний диск вправо. Затем переместите нижний диск в средний штифт. Наконец, переместите верхний диск в средний колышек. Запустите программу несколько раз, чтобы увидеть, как она работает для большей проблемы. Вы можете отрегулировать константу Delay в коде, чтобы программа работала медленнее или быстрее.

...

Python

Следующий метод MoveDisks - это ключевая рекурсивная подпрограмма.

Python

MoveDisks принимает параметры, которые сообщают, куда перемещать диски с и до, и какой привязкой он может использовать как «временное» хранилище. Он также принимает параметр, указывающий, сколько дисков нужно перемещать. Чтобы переместить диски, метод рекурсивно вызывает себя, чтобы переместить все, кроме нижнего диска, в привязку «временного хранения», затем перемещает нижний диск и затем перемещает другую обратно из «временного хранилища».

Источник: http://csharphelper.com/blog/2015/08/recursively-solve-the-tower-of-hanoi-problem-in-c/



Отзывы (через Facebook):

Оставить отзыв с помощью аккаунта FaceBook:


Как связаны методы наследования и переопределения?

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

21 06 2021 14:11:51

Перемещение элементов управления формы в C#

В этом примере показано, как обрабатывать элементы управления различными типами в форме. Класс Control определяет свойство Controls, которое представляет с...

20 06 2021 13:24:35

C++. От ламера до программера. Включая C++11 (Эллайн Алекс)

Описание книги C++. От ламера до программера. Включая C++11: Эта книга предлагает быстрый способ изучить принципы объектно-ориентированного программирования...

19 06 2021 21:55:13

Обработка исключений в C#

Что такое исключение? Исключение .NET - это объект, который описывает условие ошибки во время выполнения. Когда возникает условие ошибки во время выполнени...

18 06 2021 19:54:18

Python. Карманный справочник (Марк Лутц)

Этот краткий справочник по Python карманного типа обновлен с учетом версий 3.4 и 2.7 и очень удобен для наведения быстрых справок в процессе разработки про...

17 06 2021 12:15:10

Генерация букв с заданными частотами в C#

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

16 06 2021 5:32:13

Определить настраиваемые классы исключений в C#

Пример Выброс стандартного исключения в C# объясняет, как бросить исключения, чтобы сообщить программе о неожиданных ошибках. Пример См. Иерархию классов и...

15 06 2021 8:10:17

Список каталогов и файлов Dropbox в C#

Dropbox - это служба обмена файлами. Бесплатная базовая версия позволяет легко разделить до 2 Г Б файлов через Интернет. Версия Pro $ 9,99 в месяц дает вам...

14 06 2021 10:53:24

If, else, Switch в JavaScript

Все языки программирования предоставляют инструкции управления потоком, которые позволяют вам контролировать порядок выполнения кода. Условный оператор пре...

13 06 2021 18:23:14

Формы размера, чтобы соответствовать их содержимому в C#

В этом примере показано, как размер форм подходит для их содержимого. Выяснить, как форматы размера могут быть сложными, особенно если форма содержит MenuS...

12 06 2021 23:15:48

Как сделать кнопки панели инструментов похожими на переключатели в C#

Иногда бывает полезно сделать кнопки панели инструментов, как радиокнопки, чтобы пользователь мог выбрать только один из набора кнопок.  В этом примере вы м...

11 06 2021 3:12:31

Java для чайников (Барри Берд)

Java — современный объектно-ориентированный язык программирования. Программа, написанная на Java, способна выполняться практически на любом компьютере. Зна...

10 06 2021 2:15:22

Как программировать на Visual C# 2012 (Пол Дейтел, Харви Дейтел)

Эта книга, выходящая уже в пятом издании, является одним из самых популярных в мире учебников по программированию на платформе Microsoft .NET на языке Visu...

09 06 2021 19:28:33

Класс BufferedReader в Java

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

08 06 2021 9:16:27

Печать сетки значений с чередующимися цветами строк в C#

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

07 06 2021 5:43:36

HTML5. Недостающее руководство (Мэтью Мак-Дональд)

Доступно и в занимательной форме рассказано, как HTML превратился в HTML5. Рассмотрены семантические элементы и новые стандарты языка. Описано, как создава...

06 06 2021 7:39:49

Поверните вокруг точки, отличной от начала координат в C#

Вы можете использовать объект Matrix для поворота, масштабирования, перевода или искажения чертежа. Его метод RotateAt добавляет поворот вокруг определенно...

05 06 2021 6:31:51

Преобразование файлов doc в файлы docx в C#

В этом примере показано, как написать программу на C# для автоматического преобразования файлов doc в файлы docx. В предыдущей версии Windows, когда я дваж...

04 06 2021 10:45:24

Как распечатать содержимое элемента управления ListView на нескольких страницах в C#

Когда программа печатает в .NET, объект PrintDocument вызывает обработчик события PrintPage для создания каждой страницы. Эта программа должна установить п...

03 06 2021 13:51:31

Программирование Python Socket

Программирование сокетов - одна из самых фундаментальных технологий программирования компьютерной сети . Сокет является конечной точкой двусторонней линии...

02 06 2021 17:20:28

Нарисуйте цветное колесо с альфа-и насыщенными значениями в C#

Пример Нарисуйте цветное колесо цвета в C# показывает, как рисовать цветовое колесо. В этом примере вы можете использовать полосы прокрутки для изменения з...

01 06 2021 23:31:49

Выбор языка программирования: 6 пунктов при выборе своего языка

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

31 05 2021 12:48:39

Как создать файл в Java

Класс File имеет три конструктора и ряд полезных методов. Ниже перечислены три конструктора: Для создания файла используйте метод File.createNewFile(). Это...

30 05 2021 1:36:12

Использование базовой вставки с пользовательскими торцевыми заглушками в C#

Пример Нарисуйте линии с пользовательскими заглушками в C# показывает, как рисовать линии с пользовательскими заглушками. Например, используя эти методы, в...

29 05 2021 15:27:31

Оператор if-else в Java Примеры и синтаксис

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

28 05 2021 7:33:14

Оператор Java break и continue

Иногда желательно пропустить некоторые утверждения внутри цикла или немедленно завершить цикл, не проверяя тестовое выражение. В таких случаях мы можем исп...

27 05 2021 14:36:37

Выполнять операции набора в C#

Класс HashSet может представлять объекты в наборе и выполнять операции с множеством, такие как поиск объединения или пересечения двух множеств. Когда прогр...

26 05 2021 10:37:46

Создание вашей первой программы на Python

Запуск Pytthon Interpreter После установки интерпретатор python живет в установленной директории. На компьютерах Windows установка Python обычно помещается...

25 05 2021 15:32:41

Изменение разрешения изображения в C#

В этом примере показано, как изменить разрешение изображения. Это еще один пример, который я создал для написания книг. Обычно компьютеры работают с изобра...

24 05 2021 9:38:18

Прозрачные изображения кнопок в C#

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

23 05 2021 2:58:41

Отображение предопределенных значков системы в C#

В этом примере отображаются доступные системные значки. Следующий способ DrawIconSample отображает значок и его название. Код вызывает метод Graphics объек...

22 05 2021 16:46:50

Пусть пользователь перетаскивает изображение с прозрачными пикселями поверх фонового изображения в C#

В этом примере показано, как вы можете позволить пользователю перетащить изображение на PictureBox. Свойству PictureBox Изображение задано фоновое изображе...

21 05 2021 14:39:46

Рисуем преобразованный текст в C#

В этом примере используется следующий обработчик события Paint для рисования преобразованного текста. Код добавляет преобразования к объекту Graphics, чтоб...

20 05 2021 16:27:45

Инициализация элементов управления DataGridView с объектами в C#

В этом примере показано, как легко инициализировать элементы управления DataGridView, чтобы отобразить свойства элементов. В этом примере используется след...

19 05 2021 4:47:32

RandomAccessFile в Java

Java RandomAccessFile обеспечивает несущественный доступ к файлам. Он ведет себя как большой массив байтов, хранящихся в файловой системе. Это означает, чт...

18 05 2021 13:50:10

Как сделать метафайл в C#

Пример Отображение метафайла Windows (wmf) в C# < / a> объясняет, как отображать метафайл и почему метафайлы могут давать лучшие результаты, чем растровые...

17 05 2021 16:40:53

Сделайте движущийся фон в C#

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

16 05 2021 7:26:47

Как вычислить и выделить значения DataGridView в C#

В этом примере показано, как вычислять и выделять значения DataGridView во время выполнения. Он использует следующий код для инициализации элемента управле...

15 05 2021 2:48:39

Что такое отказобезопасные и отказоустойчивые итераторы в Java

Неуправляемые итераторы Fail-Fast iterators, возвращенные большинством типов коллекций, не переносят каких-либо структурных изменений в коллекции, итерации...

14 05 2021 1:33:12

Самоучитель Java (Хабибуллин И.Ш)

Самоучитель написан на основе материала лекций читаемых автором для студентов первого курса. Изложены практические приемы использования как традиционных, т...

13 05 2021 23:36:28

Язык программирования С++ (Б. Страуструп)

Книга Б. Страуструпа " Язык программирования С++" дает описание языка, его ключевых понятий и основных приемов программирования на нем. Это завершенное руко...

12 05 2021 13:50:22

Языки программирования для создания игр

Какие существуют языки программирования для создания игр? Одной из развитых и востребовательных в современном обществе сфер программирования является разработка игр и развлекательных приложений....

11 05 2021 9:10:57

Программирование под Android. 2-е изд. (Зигард Медникс, Лайрд Дорнин, Блэйк Мик)

В этой книге подробно рассказано о последних наработках в области программирования для Android. Тщательно изучив ее, вы научитесь создавать современные пол...

10 05 2021 0:43:39

Нарисуйте прокладку Аполлония в C#

Пример Найти круги, которые касаются трех заданных кругов (проблема Аполлония) в C# , показывают, как найти до восьми кругов, которые касаются трех заданны...

09 05 2021 16:21:54

Сложение, вычитание, умножение, деление, модуль в Bash

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

08 05 2021 1:40:56

List (список) в Python

List ( Список) в Python - один из наиболее часто используемых и очень универсальных типов данных, используемых в Python. Списки являются объектами и содержа...

07 05 2021 3:27:14

Базовые типы данных Java

В Java, объектах и примитивах есть две основные категории данных. Все члены данных и локальные переменные должны иметь тип данных, который является либо пр...

06 05 2021 9:12:27

Разница между абстрактным классом и интерфейсом в Java

Термин « Абстракция» означает скрытие внутренней реализации функции и только отображение функциональности для пользователей. Это означает, что абстрактный к...

05 05 2021 1:14:55

Печать изображений в C#

В этом примере показан простой способ печати изображений. Когда вы печатаете, обработчик события PrintPocument PrintDocument предоставляет объект Graphics...

04 05 2021 15:19:18

Математические функции Python

Функции могут делать что угодно, но их основной шаблон использования принимает параметры и возвращаемые значения . Математический модуль предоставляет неко...

03 05 2021 8:41:30

Еще:
Программирование -1 :: Программирование -2 :: Программирование -3 :: Программирование -4 :: Программирование -5 ::

И сказал Великий Программист:
«После трёх дней без программирования жизнь теряет смысл»