Моей первой мыслью было то, что вы почти никогда не должны сравнивать числа с простым равенством, поэтому «if (n == 0)» должно быть «if (n
Но потом я понял, что n должно быть int. Бросьте его на поплавок перед разделением. В сравнении с «n» вы рискуете бесконечной рекурсии.
Подумайте об использовании двойного вместо поплавка.
Ответ Мэтью Флэшена доходит до реальной причины, по которой вы получаете сообщение NaN. Исходный код ничего не возвращает от «else», поэтому вызывающая сторона, вероятно, читает мусор из стека. Следовательно, NaN.