Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50

С помощью рекурсии вывести на экран весь диапазон между заданными числами

26.03.2014, 19:05. Показов 7979. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята помогите понять рекурсию, буду очень благодарен!
Например задача: ввести из клавиатуры 2 числа, и з помощю рекурсии вывести на екран весь диапазон, который знаходится между 2-ма числами.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2014, 19:05
Ответы с готовыми решениями:

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

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

Вывести на экран n-первых чисел Фибоначчи с помощью рекурсии
Нужна программа для вывода на экран n-первых чисел Фибоначчи с помощью рекурсии и БЕЗ цикла

31
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
26.03.2014, 19:14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
void print_interval(int, int);
 
int main(int argc, char *argv[])
{
    int a, b;
    
    std::cout << "Введите a.." << std::endl;
    std::cin >> a;
    std::cout << "Введите b.." << std::endl;
    std::cin >> b;
    
    std::cout << std::endl;
    
    print_interval(++a, --b);
 
    return 0;
}
void print_interval(int from, int to)
{
    std::cout << from << std::endl;
    if(from < to)
        print_interval(++from, to);
}
1
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50
26.03.2014, 19:33  [ТС]
а через функцию програму можно как-то сделать?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
26.03.2014, 19:33
через что?
0
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50
26.03.2014, 19:35  [ТС]
через функцию а не процедурой.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
26.03.2014, 19:43
Лучший ответ Сообщение было отмечено Gorpash как решение

Решение

в C/C++ нет процедур, как таковых. Но раз очень хочется "функциональную" функцию, то как-то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
int print_interval(int, int);
 
int main(int argc, char *argv[])
{
    int a, b;
 
    std::cout << "Введите a.." << std::endl;
    std::cin >> a;
    std::cout << "Введите b.." << std::endl;
    std::cin >> b;
 
    std::cout << std::endl;
 
    print_interval(++a, --b);
 
    return 0;
}
 
int print_interval(int from, int to)
{
    std::cout << from << std::endl;
    return from < to ? print_interval(++from, to) : 0;
}
Добавлено через 1 минуту
З.Ы. Использование "не-void" функций в данном случае, имхо, неверно - из-за этого необходимо лишний раз возвращать то, что нам не требуется, обычный мусор, по сути. Не понимаю, зачем мусорить просто так..
1
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50
26.03.2014, 19:58  [ТС]
как я понимаю void ето процедура, int ,,имя функции,, (формальные параметры) ето функцыя.

Добавлено через 2 минуты
в меня преподаватель сказал ,,надо сделать через функцию,,
я програмирование изучаю все во лиш пол года... Спасибо что уделили мне немного вашего времени.

Добавлено через 10 минут

Добавлено через 39 секунд
можно ище один вопрос, что означает "?" в последнем придложении?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
26.03.2014, 20:00
Еще раз повторяю, void - это функция. Несмотря на то, что обычно ее используют без возврата значения, это все равно возможно.
C++
1
2
3
4
void f()
{
  return void();
}
Процедуры - в паскале и других

Добавлено через 1 минуту
Цитата Сообщение от Gorpash Посмотреть сообщение
что означает "?" в последнем придложении?
Это тернарный оператор. Краткая запись if-else (которая еще возвращает значение)..
Эквивалентной записью будет такая
C++
1
2
3
4
5
6
7
8
int print_interval(int from, int to)
{
    std::cout << from << std::endl;
    if(from < to)
        return print_interval(++from, to)
    else
        return 0;
}
1
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50
27.03.2014, 15:06  [ТС]
я понял, спасибо большое.

Добавлено через 18 часов 58 минут
Ище один вопрос. А можно как-то зделать чтоб наоборот значения выводились (например от 9 до 1)?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
27.03.2014, 16:49
Вроде так
C++
1
2
3
4
5
6
7
8
int print_interval(int from, int to)
{
    std::cout << to << std::endl;
    if(from < to)
        return print_interval(from, --to)
    else
        return 0;
}
1
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50
27.03.2014, 22:10  [ТС]
да ето я понял, я говорю про по чтобы как бы я не вводил значения от (1 - 10) или от (10 - 1) мне выбрасывало весь диапазон который я ввожу з клавиатуры.Что-бы програма работала в двоих направлениях.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
28.03.2014, 00:11
Это будет несколько проблематично и даже, пожалуй, костыльно..
Первый способ - самый простой и "в лоб", что называется (первым пришел в голову):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
int print_interval(int, int);
 
int main(int argc, char *argv[])
{
    int a, b;
 
    std::cout << "Введите a.." << std::endl;
    std::cin >> a;
    std::cout << "Введите b.." << std::endl;
    std::cin >> b;
 
    std::cout << std::endl;
 
    if(a > b)
        print_interval(--a, ++b);
    else
        print_interval(++a, --b);
 
    return 0;
}
 
int print_interval(int from, int to)
{
    static int sign = from < to ? 1 : -1;
 
    std::cout << from << std::endl;
    return from != to ? print_interval(from + sign, to) : 0;
}
Альтернативный вариант, который, по идее, более "правильный", т.к. вся эта логика перенесена внутрь функции.. Однако, в связи с использованием рекурсии алгоритм получился ужасным (не знаю, время уже достаточно позднее, может, кто со свежей головой придумает лучше). Но то, что наваял:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
int print_interval(int, int);
 
int main(int argc, char *argv[])
{
    int a, b;
 
    std::cout << "Введите a.." << std::endl;
    std::cin >> a;
    std::cout << "Введите b.." << std::endl;
    std::cin >> b;
 
    std::cout << std::endl;
 
    print_interval(a, b);
 
    return 0;
}
 
int print_interval(int from, int to)
{
    static int sign = from < to ? 1 : -1;
    static bool is_first = true;
    bool is_last = sign == 1 ? from + 1 > to : from < to + 1;
 
    if(is_first)
    {
        is_first = false;
        return print_interval(from + sign, to);
    }
    else
    {
        if(is_last)
            return 0;
        else
        {
            std::cout << from << std::endl;
            return from != to ? print_interval(from + sign, to) : 0;
        }
    }
}
Хотя все было бы куда проще, если бы можно было включить сами исходные числа в диапазон.

Добавлено через 2 минуты

Не по теме:

только не уверен, что второй вариант преподователь засчитает как ваш ;)



Добавлено через 9 минут
Цитата Сообщение от KOPOJI Посмотреть сообщение
Хотя все было бы куда проще
а также, если бы порядок вывода чисел был не важен (например, в любом случае вывод от меньшего к большему - тогда std::swap и все..)
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
28.03.2014, 00:24
KOPOJI,
можно не меняя практически код
Цитата Сообщение от Gorpash Посмотреть сообщение
Ище один вопрос. А можно как-то зделать чтоб наоборот значения выводились (например от 9 до 1)?
смотри вот твой код
Цитата Сообщение от KOPOJI Посмотреть сообщение
C++
1
2
3
4
5
6
void print_interval(int from, int to)
{
    std::cout << from << std::endl;
    if(from < to)
        print_interval(++from, to);
}
возьмем диапазон 2 4 чтоб много не писать
C++
1
2
3
4
5
6
7
8
9
вызываем  print_interval(2,4)
печатает 2
  вызываем  print_interval(3,4)  
   печатает 3
       вызываем  print_interval(4,4)  
       печатает 4
   выходим
 выходим 
выходим
на экране 2 3 4
теперь я меняю в твоей функции порядок
C++
1
2
3
4
5
6
void print_interval(int from, int to)
{
   if(from < to)
        print_interval(++from, to);
  std::cout << from << std::endl;
}
C++
1
2
3
4
5
6
7
8
9
 вызываем  print_interval(2,4)
    вызываем  print_interval(3,4)
       вызываем  print_interval(4,4)
       печатает 4
       выходим
    печатает 3   
    выходим
 печатает 2 
 выходим
на экране 4 3 2

чтобы напечатать 2 3 4 4 3 2
C++
1
2
3
4
5
6
7
void print_interval(int from, int to)
{
  std::cout << from << std::endl;
   if(from < to)
        print_interval(++from, to);
  std::cout << from << std::endl;
}
в Лиспе это называется, по моему, головная и хвостовая рекурсия

сначала что то делаем и заходим глубже
или
сначала залазим в самую глубину а потом когда выходим что то делаем
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
28.03.2014, 07:35
Цитата Сообщение от ValeryS Посмотреть сообщение
можно не меняя практически код
Почти "можно". Конечно да, хвостовая рекурсия вещь - но в C++ ее использование не в void-функциях, увы, является ошибкой - т.к. необходимо возвращать значения.. А здесь необходимо, все же, использовать не void-функцию (хотя я и не вижу смысла в этом). В итоге получится, что код будет либо с ошибкой (Что-то там про control reaches end и не void-функцию), либо с одной итерацией.
Ну и, помимо этого:
Если использовать хвостовую рекурсию, то уж точно не инкрементировать значение
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
print_interval(++from, to);
меняем на
C++
1
print_interval(from + 1, to);
Иначе у нас вывод "сдвинется"
Ну и, опять же, насколько я понял задание, требуется выводить числа из диапазона между числами, не включая сами эти числа. Основная проблема при использовании рекурсии в данном случае заключается именно в этом (и еще в том, что надо не-void функцию).
Если рассуждать логически, то данная проверка на первый/последний элемент должна быть сокрыта внутри функции. А это уже очень неудобно

Не по теме:

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

1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
28.03.2014, 09:23
Цитата Сообщение от KOPOJI Посмотреть сообщение
Если использовать хвостовую рекурсию, то уж точно не инкрементировать значение
точно
все же ночью нужно спать, раз
и два, метод "копи -пасте" до добра не доводит
Цитата Сообщение от KOPOJI Посмотреть сообщение
Вообще, очень хочется передать преподавателю "привет" и сообщить ему, что использование функции с возвратом значения
да для начала, бы объяснить, что нет деления на процедуры и функции
что void тип
и что единственная функция не возвращающая значения( кою можно с натяжкой назвать процедурой) это конструктор
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
28.03.2014, 09:26
ValeryS, так я объяснял на первой странице здесь, здесь
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
28.03.2014, 09:27
Цитата Сообщение от KOPOJI Посмотреть сообщение
Если рассуждать логически, то данная проверка на первый/последний элемент должна быть сокрыта внутри функции. А это уже очень неудобно
можно использовать статическую переменную
но это такие костыли

Я не понимаю этих преподавателей вместо того чтобы действительно задать рекурсивные задачи, начинается тупой перевод из цикла
А может они их не знают
0
28.03.2014, 09:28

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
можно использовать статическую переменную
ну я именно так и сделал.. Костыль конечно да, ужасный %-)

0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
28.03.2014, 09:41

Не по теме:

Цитата Сообщение от KOPOJI Посмотреть сообщение
ValeryS, так я объяснял
я имел ввиду "преподавателя(ей)"
зажать так в темном уголке и, постукивая ласково по голове стандартом,попросить объяснить разницу :)



Цитата Сообщение от KOPOJI Посмотреть сообщение
Еще раз повторяю, void - это функция.
выражайся яснее , много не окрепших умов, вокруг
"Еще раз повторяю, с void - это функция."
или void это тип
а void f() это функция
0
28.03.2014, 09:43

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
я имел ввиду "преподавателя(ей)"
я уже понял) Как обычно, сначала напишешь, а потом подумаешь))
Цитата Сообщение от ValeryS Посмотреть сообщение
выражайся яснее
да, несколько неточно выразился.. :pardon:
...А все-таки, быть может, есть другой алгоритм..?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.03.2014, 09:43
Помогаю со студенческими работами здесь

Цикл: Вывести все числа, расположенные между заданными числами, в порядке их возрастания
Даны два целых числа А и В (А&lt;B). Вывести все целые числа, расположенные между данными числами (включая сами эти числа), в порядке их...

Циклы: вывести все целые числа, расположенные между заданными числами, в порядке убывания
Помогите с заданием, пожалуйста. Даны два целых числа А и В (А&lt;В). Вывести все целые числа расположенные между данными числами (не...

Вывести все элементы массива, кроме тех, которые находятся между заданными числами, и их номера
Дан массив размера N и два числа A и B (А&lt;B) Вывести все элементы массива, кроме тех, которые находятся между этими числами и их номера. ...

Задать произвольно 5 натуральных чисел. Вывести на экран только те из них, которые являются простыми числами. Диапазон н
Задать произвольно 5 натуральных чисел. Вывести на экран только те из них, которые являются простыми числами. Диапазон не указан.

Вывести все целые числа, рассположенные между заданными числами, включая сами эти числа, в порядке их убывания
Даны два целых числа А и B (A&lt;B). Вывести все целые числа, рассположенные между данными числами(включая сами эти числа), в порядке их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru