Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Gorpash
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50
26.03.2014, 19:05     С помощью рекурсии вывести на экран весь диапазон между заданными числами #1
Ребята помогите понять рекурсию, буду очень благодарен!
Например задача: ввести из клавиатуры 2 числа, и з помощю рекурсии вывести на екран весь диапазон, который знаходится между 2-ма числами.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2014, 19:05     С помощью рекурсии вывести на экран весь диапазон между заданными числами
Посмотрите здесь:

C++ Найти произведение между соответствующими числами первой и второй строки и вывести результат на экран
Нужно расставить между числами знаки + или - таким образом, чтобы получилось выражение, значение которого равно s и вывести его на экран C++
C++ Вывести все комбинации чисел от 1 до 7 с помощью рекурсии
Вывести на экран диапазон температур C++
C++ Вывод всех чисел, находящихся между двумя заданными числами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
28.03.2014, 09:58     С помощью рекурсии вывести на экран весь диапазон между заданными числами #21
Gorpash,
попроси у своего преподавателя когда он будет тестировать программу ввести числа 1 и 10000000.
а когда программа рухнет, невинно спроси почему

Добавлено через 1 минуту
Цитата Сообщение от KOPOJI Посмотреть сообщение
...А все-таки, быть может, есть другой алгоритм..?
ну на вскидку три аргумента: начало, конец и текущий

Добавлено через 11 минут
есть немного задач которые можно сформулировать и как рекурсию и как цикл
например факториал
цикл
факториал числа n это произведение чисел от 1 до n(от n до 1)

рекурсия
факториал числа n это произведение n на факториал (n-1),при условии что факториал 1 (и 0) равен 1

в зависимости от формулировки и решение
но чаще всего притягивают рекурсию за уши
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KOPOJI
Модератор
 Аватар для KOPOJI
16239 / 6450 / 389
Регистрация: 12.06.2012
Сообщений: 19,326
28.03.2014, 10:00     С помощью рекурсии вывести на экран весь диапазон между заданными числами #22
Ну да, можно будет избавиться от одной статической переменной..
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
#include <iostream>
 
int print_interval(int, 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, a);
 
    return 0;
}
 
int print_interval(int from, int to, int current)
{
    static int sign = from < to ? 1 : -1;
    bool is_last = sign == 1 ? from + 1 > to : from < to + 1;
 
    if(from == current)
        return print_interval(from + sign, to, from);
    else
    {
        if(is_last)
            return 0;
        else
        {
            std::cout << from << std::endl;
            return from != to ? print_interval(from + sign, to, from) : 0;
        }
    }
}
Но появляются два минуса:
1) Необходимо передавать три аргумента вместо двух
2) Если кому-то придется разбирать программу, то она может показаться нелогичной - ведь значение from будет меняться, и при дебаге может быть непонятно смысл сего действия
Насколько я знаю, значения по умолчанию в C++ (да и во множестве других ЯП) не подразумевают возможности задания локальной переменной в качестве значения по умолчанию, хотя это бы убрало первый пункт..

Добавлено через 2 минуты
З.Ы. можно избавиться и от второй переменной, протупил)
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
#include <iostream>
 
int print_interval(int, 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, a);
 
    return 0;
}
 
int print_interval(int from, int to, int current)
{
    static int sign = from < to ? 1 : -1;
 
    if(from == current)
        return print_interval(from + sign, to, from);
    else
    {
        if(current + sign == to)
            return 0;
        else
        {
            std::cout << from << std::endl;
            return from != to ? print_interval(from + sign, to, from) : 0;
        }
    }
}
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
28.03.2014, 10:02     С помощью рекурсии вывести на экран весь диапазон между заданными числами #23
Цитата Сообщение от KOPOJI Посмотреть сообщение
Но появляются два минуса:
тут самый главный минус
решение задач инструментом для этого не предназначенным
еще очень часто задачи для баз данных решают на Си
неужели этим пытаются привить любовь к языку
KOPOJI
Модератор
 Аватар для KOPOJI
16239 / 6450 / 389
Регистрация: 12.06.2012
Сообщений: 19,326
28.03.2014, 10:04     С помощью рекурсии вывести на экран весь диапазон между заданными числами #24
...ну и можно избавиться от ненужных ветвлений
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
#include <iostream>
 
int print_interval(int, 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, a);
 
    return 0;
}
 
int print_interval(int from, int to, int current)
{
    static int sign = from < to ? 1 : -1;
 
    if(from == current)
        return print_interval(from + sign, to, from);
    if(current + sign == to || from == to)
        return 0;
    std::cout << from << std::endl;
    return print_interval(from + sign, to, from);
}
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
неужели этим пытаются привить любовь к языку
Скорее, просто выполнить план..

ValeryS
28.03.2014, 10:05
  #25

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
решение задач инструментом для этого не предназначенным
вспоминается классическое
-Товарищ солдат,возмите лом и подметите плац.
-Товарищ прапорщик, но ведь метелкой удобней
- Ничего,ничего. Главное чтобы ты задолбался.

Gorpash
0 / 0 / 0
Регистрация: 26.03.2014
Сообщений: 50
30.03.2014, 01:31  [ТС]     С помощью рекурсии вывести на экран весь диапазон между заданными числами #26
ето понятно, а что-бы програма работала в всех направлениях например 1-10 и от 10-1.

Добавлено через 13 минут
что означает переменная current?
KOPOJI
Модератор
 Аватар для KOPOJI
16239 / 6450 / 389
Регистрация: 12.06.2012
Сообщений: 19,326
30.03.2014, 11:17     С помощью рекурсии вывести на экран весь диапазон между заданными числами #27
Цитата Сообщение от Gorpash Посмотреть сообщение
а что-бы програма работала в всех направлениях
А вы вообще код, который выкладывается здесь, пробуете запускать..?
Цитата Сообщение от Gorpash Посмотреть сообщение
что означает переменная current?
http://translate.google.ru/#ru/en/%D...89%D0%B8%D0%B9. Именно это и означает - текущий элемент
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
30.03.2014, 11:30     С помощью рекурсии вывести на экран весь диапазон между заданными числами #28
Цитата Сообщение от KOPOJI Посмотреть сообщение
А все-таки, быть может, есть другой алгоритм..?
предлагаю свой
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
#include <iostream>
 
int printInterval(int, int);
 
int main(int argc, char *argv[])
{
    int a, b;
 
    std::cout << "vvedite a.." << std::endl;
    std::cin >> a;
    std::cout << "vvedite b.." << std::endl;
    std::cin >> b;
 
    std::cout << std::endl;
 
    printInterval(a, b);
    system("PAUSE");
    return 0;
}
 
int printInterval(int a, int b)
{
    std::cout << a << std::endl;
    if (a != b)
        return printInterval(a + (a<b?1:-1), b);
    return 0;
}
хотя не тут числа в диапазоне получаются, не канает.
KOPOJI
Модератор
 Аватар для KOPOJI
16239 / 6450 / 389
Регистрация: 12.06.2012
Сообщений: 19,326
30.03.2014, 11:34     С помощью рекурсии вывести на экран весь диапазон между заданными числами #29
dimcoder, и в чем различия? В том, что каждый раз заново проверяете "a < b" вместо одной проверки и статической переменной?

А теперь еще внимательнее перечитайте тему
Цитата Сообщение от KOPOJI Посмотреть сообщение
Ну и, опять же, насколько я понял задание, требуется выводить числа из диапазона между числами, не включая сами эти числа. Основная проблема при использовании рекурсии в данном случае заключается именно в этом (и еще в том, что надо не-void функцию).
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,040
30.03.2014, 11:34     С помощью рекурсии вывести на экран весь диапазон между заданными числами #30
dimcoder,
если бы ты внимательно читал
то понял бы, что предельные значения не должны печататься, да и еще
Цитата Сообщение от Gorpash Посмотреть сообщение
всех направлениях например 1-10 и от 10-1.
и хоть убей не пойму а зачем там возвращаемые значения? чтоб было?
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
30.03.2014, 11:37     С помощью рекурсии вывести на экран весь диапазон между заданными числами #31
Цитата Сообщение от KOPOJI Посмотреть сообщение
не включая сами эти числа.
Да, чего то я не дочитал. Пардон.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 17:19     С помощью рекурсии вывести на экран весь диапазон между заданными числами
Еще ссылки по теме:

C++ Вывести в порядке убывания числа, которые находятся между заданными А и В, и их количество
С помощью рекурсии вывести все числа от 1 до введенного пользователем числа k C++
Как вывести весь массив с помощью функции? C++

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

Или воспользуйтесь поиском по форуму:
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
30.03.2014, 17:19     С помощью рекурсии вывести на экран весь диапазон между заданными числами #32
Вот, написал свой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
int print_interval(int a, int b)
{   
    cout << (b - a > 0 ? ++a : --a) << endl;
    return (abs(a - b) != 1) ? print_interval(a, b) : 0;
}
 
int main(int argc, char *argv[])
{
    int a, b;
 
    a = 3;
    b = 7;
/*
    a = 7;
    b = 3;
*/
    print_interval(a, b);
    system("PAUSE");
}
При адекватных вводимых данных вроде работает
Yandex
Объявления
30.03.2014, 17:19     С помощью рекурсии вывести на экран весь диапазон между заданными числами
Ответ Создать тему
Опции темы

Текущее время: 23:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru