Рекурсия. Пример работы с натуральным числом

Задача:

  • Дано натуральное число. С помощью рекурсии определить разницу между минимальной и максимальной цифрой этого числа и найти сумму максимальной и минимальной цифры этого числа.
    К сведению:

  • Отрицательные и нецелые числа натуральными не являются.
Сама задача не напрашивает себе применения рекурсии, но мне кажется сам пример именно на рекурсии очень познавателен и полезен:

В этом примере параметр, принимающий значение входящего в функцию аргумента, внутри функции не изменяется. Само число на каждом рекурсивном шаге делится на 10, а из полученного делением числа выдирается последняя цифра, которая записывается в переменную temp. Контрольной точкой для прекращения рекурсивных вызовов является момент времени, когда результатом очередного деления оказывается ноль. Ссылочные параметры используются для того, чтобы каждый новый экземпляр функции не создавал копий ради них, а просто чтобы подставлял одну и ту же сущность: непосредственный аргумент. Так у нас получается два непосредственных аргумента, которые изменяются множеством экземпляров функций, если условие для изменения справедливо.
Процесс работы программы при заданном N = 12345 можно описать так:
будут созданы функции, в параметры которых придут следующие значения:
12’345
(12’345/10) ==> 1’234
(1’234/10) ==> 123
(123/10) ==> 12
(12/10) ==> 1
(1/10=0 — возврат не рекурсивный) ==> 0

Итого: 6 экземпляров функций, где значение каждого параметра отлично от значения параметра любого другого экземпляра функции.

Поскольку параметры min и max имеют тип ссылочного характера — любой экземпляр функции может повлиять на ушедший в функцию аргумент напрямую. Чем мы и пользуемся, когда проверяем значение на минимум и максимум. Проверяем параметр и если результат проверки положительный — изменяем значение параметра, чем влечём прямое изменение ушедшего в функцию аргумента.
Ход изменений значений в temp для каждого нового экземпляра функции при N = 12345 выглядит приблизительно так:
12 345 % 10 == 5 //Получили самую правую цифру числа
12 34 % 10 == 4 //Получили вторую справа цифру числа
123 % 10 == 3 //Получили третью справа цифру числа
12 % 10 == 2 //Получили четвёртую справа цифру числа
1 % 10 == 1 //Получили пятую справа цифру числа
В начале работы с рекурсивной функцией нужно определить первые значения минимуму и максимуму. Разумеется, и минимум, и максимум — должны входить в заданное число. Очень удобно взять самую правую цифру, а потом уже сверять с получаемыми остатками и, при необходимости, их изменять.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

3 комментария: Рекурсия. Пример работы с натуральным числом

  • Аноним говорит:

    🙄 😯




    0



    0
  • dmitrey говорит:

    почему если мы зададим N через консоль , выдает неверный ответ?

    Автор сайта отвечает:
    а поточнее

    dmitrey говорит:
    если N не константа, а мы ее вводим через cin >>

    Автор сайта отвечает:
    Пример некорректно работает если вводить отрицательное число, т.к. каждая цифра получается отрицательной. Если вводить целое положительное, то у меня пример работает.




    0



    0
  • Павел говорит:

    мне не понятна перезапись минимума и максимума. насколько мне известно, функция swap меняет местами введенные в нее параметры

    Автор сайта отвечает:
    Этот пример приведён не для решения задачи, а для помощи в изучении рекурсии.
    Тут вообще-то применяется функция swap внутри рекурсивной функции.
    Можно без swap, просто присвоить min=temp, max=temp в тех местах (как сейчас уже и есть).




    0



    0

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/uliya-torgasheva/pervaya-kniga-unogo-programmista-uchimsya-pisat-programmy-na-scratch-16901902/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

В черном-черном городе, на черной-черной улице, в черном-черном доме, в черно-черной квартире сидит черный-черный мужик и говорит: - Никогда больше не буду сам заправлять картриджи!

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок