Содержание
Задача: написать рекурсивный метод перевода любого целого десятичного числа в двоичную систему, например, 78 = 01001110.
Теоретическая часть
Чтобы перевести число из десятичной системы в двоичную необходимо последовательно делить число на 2 до тех пор, пока частное от деления не станет равным нулю и, затем, переписать остатки от деления в обратном порядке. Например, возьмем число 78. Производим последовательное деление:
- 78÷ 2 = 39 (в остатке 0);
- 39 ÷ 2 = 19 (в остатке 1);
- 19 ÷ 2 = 9 (в остатке 1);
- 9 ÷ 2 = 4 (в остатке 1);
- 4 ÷ 2 = 2 (в остатке 0);
- 2 ÷ 2 =1 (в остатке 0);
- 1 ÷ 2 = 0 (в остатке 1).
Записываем остатки от деления на 2 в обратном порядке и получаем следующую последовательность: 1001110. Это и будет двоичное представление числа 78.
Так как все промежуточные вычисления в рекурсивных методах сохраняются в стеке, то это позволяет нам без лишних действий по перестановке местами чисел 0 и 1 написать рекурсивный метод (в стеке действует правило «LIFO — Last In First Out» — последний пришел — первый вышел).
Перевод числа из десятичной системы в двоичную с использованием рекурсии
Развернутый вариант метода перевода десятичного числа в двоичную систему с использованием рекурсии:
static string DecToBin(int n) { if (n == 0) //базовый сценарий - выход из рекурсии return "0"; if (n / 2 > 0) return DecToBin(n / 2) + (char)(n % 2 + '0'); else return ""+ (char)(n % 2 + '0'); }
Этот же метод можно записать с использованием тернарной операции (сокращенной проверкой) следующим образом:
static string DecToBin(int n) { return (n / 2 > 0 ? DecToBin(n / 2) : "") + (char)(n % 2 + '0'); }
Проверим работу метода. Для этого мы можем воспользоваться обычным калькулятором. Переведем число 50 в двоичную систему:
Проведем теперь операцию перевода в двоичную систему, используя нашу программу:
static void Main(string[] args) { Console.WriteLine(DecToBin(50)); }
Результат в консоли:
Ведущие нули роли не играют, так как при переводе из двоичной систему в десятичную они никак не повлияют на результат.
Решение лабораторной работы (исходный код)
Ниже представлен исходный код программы для перевода любого числа из десятичной системы в двоичную:
namespace ConsoleApp1 { internal class Program { static string DecToBin(int n) { return (n / 2 > 0 ? DecToBin(n / 2) : "") + (char)(n % 2 + '0'); } static void Main(string[] args) { Console.Write("Введите число. N = "); string str = Console.ReadLine(); int n; if (int.TryParse(str, out n)) Console.WriteLine(DecToBin(n)); else Console.WriteLine("Ошибка ввода"); } } }
Результат работы программы:
110010
Итого
Сегодня мы разработали консольное приложение для перевода числа из десятичной системы в двоичную, используя рекурсию. Благодаря тому, что в рекурсивных методах используется стек, нам не пришлось проводить никаких дополнительных преобразований полученной строки, представляющей число в двоичной форме. Стоит отметить, что в C# имеются готовые методы для таких операций преобразования.