Разница между до и после декремента в аргументе рекурсивной функции

У меня есть следующий пример кода, где я использовал предварительный декремент

void function(int c)
{
if(c == 0)
{
return;
}
else
{
cout << "DP" << c << endl;
function(--c);
cout << c << endl;
return;
}
}

Эта функция дает выход для входа 4 в виде:

 DP3
DP2
DP1
DP0
0
1
2
3

Но когда я использую пост декремент

void function(int c)
{
if(c == 0)
{
return;
}
else
{
cout << "DP" << c << endl;
function(c--);
cout << c << endl;
return;
}
}

Выход идет в бесконечном цикле с DP4

Можете ли вы объяснить мне подробно, почему это происходит?

2

Решение

Это происходит потому, что функция (c—) будет вызываться с тем же значением c, а когда она завершится, c будет уменьшен. Но так как он вызывается рекурсивно, следовательно, он будет вызываться с тем же значением без возможности возврата, и в итоге вы столкнетесь с ошибкой переполнения стека.

Предположим, что int x = 1, y = 0; Теперь y = x ++ приведет к y == 1 и x == 2. Но если вы сделаете y = ++ x, тогда бот x и y будет равен 2.

5

Другие решения

Так как --c вернусь c-1,тем не мение c-- вернуть c.Так когда вы используете function(c--) равно function(c);c = c-1;,c никогда не будет 0Так что функция не остановится.
Чтобы узнать разницу между --x а также x-- Вы можете попробовать следующий код:

int x = 5,y=5;
cout<<x--<<endl;
cout<<--y<<endl;
cout<<x<<" "<<y<<endl;
5

В случае, если значение после декремента будет передано перед декрементом, всегда одинаковое значение будет передано в функцию, оно никогда не выйдет.

функция (c—), сначала она вызывает функцию (c), позже произойдет декремент c—.

1
По вопросам рекламы [email protected]