Потому, что иллюстрация никчёмная. То же самое делается на C и не кто не называет это какими-то умными словами. В gcc можно ещё делать замыкания на вложенных функциях. Только хер ли толку от них, коли всё на стеке. До тех пор, пока переменные не будут располагаться за пределами стека и не будет garbage collector'а это всё игрушка. Первое в C++ победили (через объект класса, но синтаксис кошмарный), второе для C++ в нормальном виде существовать не может (существует в ненормальном: http://www.hpl.hp. …ersonal/Hans_Boehm/gc/) На тебе рекурсивный фибоначи на C, с замыканиями, динамическим программированием, lexical scoping для переменных и т.п., памяти есть не много, стека тоже не много (~пропорционально аргументу), работает также быстро, как нерекурсивный. Только никто это не называет нанотехнологичными словами почему-то. Компилятор исключает хвостовую рекурсию, кстати, но в фибоначи не тот случай, рекурсия остаётся.
/* Компилировать gcc -Wall -std=gnu99 -O6 file.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
typedef unsigned long long fib_t;
fib_t fib(unsigned X)
{
unsigned max=0, depth=0;
fib_t p[X+1];
memset(p, 0, (X+1)*sizeof(p[0]));
fib_t f(unsigned x)
{
fib_t g(unsigned x) {
if (x==0) return 0;
else if (x<=2) return 1;
else return f(x-1)+f(x-2);
}
if (++depth>max) max=depth;
/* использовать -DNODYNAMIC при компиляции для получения классического тормозного алгоритма */
#ifndef NODYNAMIC
if (p[x]!=0) return p[x];
else return p[x]=g(x);
#else
return g(x);
#endif
depth--;
}
fib_t retval=f(X);
printf("max. stack depth: %u\n", max);
return retval;
}
fib_t fib_nonrecursive(unsigned x)
{
if (x==0) return 0;
else if (x<2) return 1;
fib_t fib1=1, fib2=1, fib_sum=0;
for (unsigned n=2; n<x; n++) {
fib_sum=fib1+fib2;
fib1=fib2;
fib2=fib_sum;
}
return fib_sum;
}
int main(int argc, char *argv[])
{
if (argc<2)
fprintf(stderr, "Usage %s <n>\n", argv[0]), exit(1);
unsigned x;
if (sscanf(argv[1], "%u", &x) < 1 || x>INT_MAX)
fprintf(stderr, "%s: not a number\n", argv[1]), exit(1);
if (x >= 90)
fprintf(stderr, "fib(%u): integer overglow\n", x), exit(1);
printf("fib(%u)=%llu\n", x, fib/*_nonrecursive*/(x));
return 0;
}
[ZX]