Я могу придумать несколько причин:
цели отладки / тестирования (предупреждение - не проверяли этот код):
#include <stdio.h>
#define MAX_INPUT 46
int runs=0;
int fib1(int n){
++runs;
return n>2?fib1(n-1)+fib1(n-2):1;
};
int fib2(int n,int *cache,int *len){
++runs;
if(n<=2){
if(*len==2)
return 1;
*len=2;
return cache[0]=cache[1]=1;
}else if(*len>=n)
return cache[n-1];
else{
if(*len!=n-1)
fib2(n-1,cache,len);
*len=n;
return cache[n-1]=cache[n-2]+cache[n-3];
};
};
int main(){
int n;
int cache[MAX_INPUT];
int len=0;
scanf("%i",&n);
if(!n||n>MAX_INPUT)
return 0;
printf("fib1(%i)==%i",n,fib1(n));
printf(", %i run(s)\n",runs);
runs=0;
printf("fib2(%i)==%i",n,fib2(n,&cache,&len));
printf(", %i run(s)\n",runs);
main();
};
Я использовал переменные в области видимости для fib2, но это еще один сценарий, в котором могут быть полезны глобальные переменные (чисто математические функции, которые должны хранить данные, чтобы избежать бесконечного использования)
программ, используемых только один раз (например, для конкурса), или когда нужно сократить время разработки
globals полезны как типизированные константы, где функция где-то требует * int вместо int.
Я обычно избегаю глобальных вызовов, если собираюсь использовать программу более суток.