Хотя ваши версии fun1 и fun2 имеют разную пространственную сложность, их временная сложность составляет O (n) .
Однаконерекурсивную функцию также можно записать в виде:
#import <math.h>
double fun2(int n) {
return pow(0.5, n);
}
Эта функция имеет пространственную и временную сложность O (1) и будет более эффективной для большинства n (вероятно, n > 5).
Что касается исходного вопроса: он очень сложный, поскольку зависит от оптимизации компилятора:
Наивная реализация fun1 имеет сложность пространства O (n) , так как вызов fun1 (n) будет иметь рекурсивную глубину n и, следовательно,требует n фреймов вызова в стеке.На большинстве систем он будет работать только до определенного n .Затем вы получите ошибку Stack Overflow , поскольку размер стека ограничен.
Оптимизирующий компилятор распознает, что это хвостовая рекурсивная функция, и оптимизирует ее до значения, очень близкого к * 1038.* fun2 , который имеет пространственную сложность O (1) , поскольку использует фиксированное число переменных с фиксированным размером, независимым от n и без рекурсии.