Оператор рекурсии и предварительного декремента
У меня есть эта функция:
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)