Я думаю, что все эти решения неэффективны. Для получения результата требуется много рекурсивных вызовов.
unsigned fib(unsigned n) {
if(n == 0) return 0;
if(n == 1) return 1;
return fib(n-1) + fib(n-2);
}
Этот код требует 14 вызовов для получения результата для fib (5), 177 для fin (10) и 2.7kk для fib (30).
Вам лучше использовать этот подход или, если вы хотите использовать рекурсию, попробуйте это:
unsigned fib(unsigned n, unsigned prev1 = 0, unsigned prev2 = 1, int depth = 2)
{
if(n == 0) return 0;
if(n == 1) return 1;
if(depth < n) return fib(n, prev2, prev1+prev2, depth+1);
return prev1+prev2;
}
Эта функция требует n рекурсивных вызовов для вычисления числа Фибоначчи для n. Вы все еще можете использовать его, вызывая fib (10), потому что все остальные параметры имеют значения по умолчанию.