1

Тема: цікава задачка на рекурсію

Привіт усім форумчанам!

знайшов цікаву задачку
Але ніяк не можу її реалізувати на С++ в зв'язку з вимогами до розв`язку
Вся заминка в тому що треба виводити непарні числа по одному в порядку в якому їх початково вводили.


Прихований текст

K: Вывести нечетные числа последовательности

Дана последовательность натуральных чисел (одно число в строке), завершающаяся числом 0. Выведите все нечетные числа из этой последовательности, сохраняя их порядок.

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

Ввод    Вывод
3       3
1       1
2
0


мої напрацювання(Виводить в неправильному порядку):

Прихований текст
#include <iostream>
#include <string>
#include <Windows.h>
#include <string>

using namespace std;

void print_odd()
{
    int tmp;
    cin >> tmp;

    if(tmp != 0)
        print_odd();

    if(tmp % 2 == 1)
        cout << tmp << endl;
    return;
}



int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    print_odd();

    cout << endl;
    system("pause");
    return 0;
}

2 Востаннє редагувалося yarko (12.07.2014 15:50:21)

Re: цікава задачка на рекурсію

м... а до чого тут рекурсія?

void func() {
  int tmp;
  std::vector<int> data;
  while (cin >> tmp, tmp != 0)
    data.push(tmp);
  for (int i = 0; i < data.count(); i++)
    if (data[i] %2 == 1)
      cout << data[i] << endl;
}

так не підходить хіба?

3

Re: цікава задачка на рекурсію

Спершу виводьте, потім викликайте рекурсію, і все буде в правильному порядку.
І return можете прибрати, він нічого не робить.

Подякували: vector91

4

Re: цікава задачка на рекурсію

yarko написав:

м... а до чого тут рекурсія?

void func() {
  int tmp;
  std::vector<int> data;
  while (cin >> tmp, tmp != 0)
    data.push(tmp);
  for (int i = 0; i < data.count(); i++)
    if (data[i] %2 == 1)
      cout << data[i] << endl;
}

так не підходить хіба?

реалізувати виключно за допомогою рекурсії

5

Re: цікава задачка на рекурсію

koala написав:

Спершу виводьте, потім викликайте рекурсію, і все буде в правильному порядку.
І return можете прибрати, він нічого не робить.

але якщо я буду спочатку виводити, то буде така ситуація:
я вводжу число, воно його зразу виводить(якщо  непарне)

і т. д.

а наскільки я розумію потрібно після всього вводу, вивести всі непарні числа, чи не так?

6

Re: цікава задачка на рекурсію

snaiper написав:

реалізувати виключно за допомогою рекурсії

void func() {
  int tmp;
  static std::vector<int> data;
  int level = data.size();
  cin >> tmp;
  if (tmp != 0) {
    data.push(tmp);
    func();
  } else if (level != 0) return;
  for (int i = 0; i < data.count(); i++)
    if (data[i] %2 == 1)
      cout << data[i] << endl;
}

а так підходить?
глобальних змінних нема, адже data доступна лише в межах функції.

7

Re: цікава задачка на рекурсію

snaiper написав:
koala написав:

Спершу виводьте, потім викликайте рекурсію, і все буде в правильному порядку.
І return можете прибрати, він нічого не робить.

але якщо я буду спочатку виводити, то буде така ситуація:
я вводжу число, воно його зразу виводить(якщо  непарне)

і т. д.

а наскільки я розумію потрібно після всього вводу, вивести всі непарні числа, чи не так?

Ніде такого не сказано.

8

Re: цікава задачка на рекурсію

можливо..
сам себе заплутав, і ускладнив завдання :)