Оператор рекурсии и предварительного декремента

У меня есть эта функция:

void m(int n)
{
    if(n > 0)
      m(--n);
      cout << n << " "; //for n = 5 --> output is: 0 0 1 2 3 4
}

У меня проблема с пониманием того, как это работает. Например:

n (вход) = 5

выход: 0 0 1 2 3 4

Мой вопрос: почему он показывает ноль дважды?

Когда я добавляю скобки, как это:

void m(int n)
{
    if(n > 0)
    {
        m(--n);
        cout << n << " "; // now, it shows 0 1 2 3 4 (n = 5)
    }
}

Итак, какие скобки вызывают в этом коде, что "0" существует только один раз?

И когда я изменяю пре-декремент (--n) на пост-декремент (n--), это ничего не показывает. Зачем?

Может ли кто-нибудь помочь мне понять, как это работает?

2 ответа

Решение

Первое, что нужно отметить: в C++, если вы не ставите скобки после if заявление, только следующая строка будет в заявлении.

Пример:

if(x > 0)
   cout << 1;
   cout << 2;

Вот cout << 2 всегда будет выполняться независимо от значения х

Правильный способ написания этого

if(x > 0)
{
  cout << 1;
  cout << 2;
}

То же самое касается else Заявления Так что это было для скобок.

Мое дикое предположение для почтового декремента следующее: если вы делаете m(n--), переданное значение будет 5, значение n изменится только после вызова функции и выйдет из области видимости (так что это не будет иметь значения). Так что произойдет бесконечное количество m(5) вызовов, и поэтому ничего не появляется. (Я не уверен насчет этой части, поэтому, пожалуйста, скажите мне, если не так)!

Надеюсь, это помогло!

Похоже, вы перепутали с синтаксисом Python, где if определяется отступом. В C (и C++, C#, Java и многих других языках) область действия - это одно утверждение (которое заканчивается ;) если вы не используете фигурные скобки { а также }, В 1-м варианте вашего кода cout << n << ... будет выполняться всегда, независимо от значения n, Во втором варианте это будет выполнено только if(n > 0)

Другие вопросы по тегам