Вот ответ на ваш второй вопрос:
Я думаю, что у вас возникла эта проблема с самого начала:
while(n>=0){
- бесконечный цикл, поскольку n
- целое число без знака.n
станет отрицательным из-за уменьшения.Но так как он не подписан, он обернется и вызовет переполнение стека в вашей рекурсии.
Кроме того, ваш алгоритм, вероятно, самый медленный способ сделать это.Это работает в экспоненциальном времени.Так что, когда значение n
большое, его запуск займет очень много времени.
Лучший способ заключается в следующем:
int n = 48;
return (unsigned long long)(pow(1.6180339887498948,n) * 0.44721359549995794 + 0.5);
Этот метод будет работать в постоянное время.:)