ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июля
370849 Топик полностью
fk0, легенда (24.11.2012 14:56 - 15:05, просмотров: 118) ответил Evgeny_CD на Я не про джабу. Я про иллюстрацию подхода функционального программирования. Который лично я плохо вкуриваю пока.
Потому, что иллюстрация никчёмная. То же самое делается на 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]