Рекурсивные функции работают точно так же, как нерекурсивные функции, включая то, что вызов функции не приводит к автоматическому и немедленному возвращению результата этого вызова функции.
Вам необходимо возвращать значение для каждого пути выполнения, иначе ваш код будет иметь неопределенное поведение;
int gcd(int p, int q)
{
if (p < q)
{
return gcd(q, p);
}
if (q == 0)
{
cout << "p: " << p << endl;
return p;
}
else
return gcd(q, p % q);
}
(Приличный компилятор должен быть в состоянии предупредить вас о пропущенных return
sУзнайте, как включить такие предупреждения.)