threeWays(id+1,n-1); // when this returns,
threeWays(id+1,n-2); // ... the program still does this
Вы рекурсивно вызываете функцию дважды . Поэтому после того, как он достигает конца для первого вызова, он немного раскручивает стек, а затем переходит ко второй рекурсии.
И после этого второго вызова он снова дважды разветвляется на каждом уровне.
Если это сбивает с толку, может показательно пошагово пройти программу в отладчике. Вы можете видеть каждый кадр в стеке вызовов, включая локальные переменные и строку кода, в которой они находятся.