Originariamente inviato da andr3a
un linguaggio serio non dovrebbe avere overhead in ricorsione, in C arrivo a 12093810389832818310 chiamate in ricorsine con una valanga di operazioni e se la gode la ricorsione invece di respingerla .
Questa cosa che il PHP ce l'ha ma limitata mi fa ridere ( per non piangere )
Non puoi paragonare php a C, semplicemente sono 2 universi differenti...
E cmq l'overhead c'è eccome.
Un pò di benchmark su un programma scemo che non fa altro che sommare
Sorgenti versione iterativa:
codice:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
long long i=0, j=0, n = strtoll(argv[1], NULL, 10);
for (i=0; i<n; i++) {
j++;
}
printf("%lld\n", j);
return 0;
}
versione ricorsiva:
codice:
#include <stdio.h>
#include <stdlib.h>
long long fact(long long i) {
return (i<=1) ? 1 : 1 + fact(i-1);
}
int main(int argc, char *argv[]) {
printf("%lld\n", fact(strtoll(argv[1], NULL, 10)));
return 0;
}
e questi sono i tempi di esecuzione
codice:
[fabio@myproxy fact]$ time -p ./ric 209600
209600
real 0.04
user 0.02
sys 0.02
[fabio@myproxy fact]$ time -p ./ite 209600
209600
real 0.00
user 0.00
sys 0.00
Oltre 209600 la ricorsione non va se metto valori più alti va in segmentation fault, come arrivi tu a quel numero di chiamate ricorsive non lo saprei proprio, spero sia una numero buttato li tanto per dire.
Mentre iterativamente non hai limiti:
codice:
[fabio@myproxy fact]$ time -p ./ite 4000000000
4000000000
real 32.98
user 28.28
sys 0.00