Следующие два фрагмента кода C # дают разные результаты (при условии, что переменный уровень используется как до, так и после рекурсивного вызова). Почему?
public DoStuff(int level)
{
// ...
DoStuff(level++);
// ...
}
public DoStuff(int level)
{
// ...
DoStuff(level+1);
// ...
}
Прочитав некоторые ответы ниже, я подумал, что было бы целесообразно опубликовать трассировки стека для уровней ++, ++ level и level + 1, чтобы подчеркнуть, насколько обманчива эта проблема.
Я упростил их для этого поста. Рекурсивная последовательность вызовов начинается с DoStuff (1).
// уровень ++
DoStuff(int level = 1)
DoStuff(int level = 2)
DoStuff(int level = 2)
DoStuff(int level = 2)
// ++ level
DoStuff(int level = 4)
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
// уровень + 1
DoStuff(int level = 4)
DoStuff(int level = 3)
DoStuff(int level = 2)
DoStuff(int level = 1)