Рассмотрим функцию f (x, y):
f(x,0) = x*x;
f(0,y) = y*(y + 1);
f(x,y) = f(x,y-1) + f(x-1,y);
Если кто-то попытается реализовать это рекурсивно на каком-то языке, например C ++, он столкнется с проблемой.
Предположим, что функция сначала вызывается с x = x0
и y = y0
. Тогда для любой пары (x, y), где 0 <= x < x0
и 0 <= y < y0
, промежуточные значения будут вычислены несколько раз - рекурсивные вызовы сформируют огромное дерево, в котором несколько листьев фактически будут содержать одинаковые пары (x, y). Для пар (x, y), где x и y близки к 0, значения будут вычисляться много раз.
Например, я протестировал аналогичную функцию, реализованную в C ++ - для x=20
и y=20
ее вычисление занимает около 4 часов (да, четыре часа Земли!).
Очевидно, что реализация может быть переписана таким образом, чтобы повторные вычисления не выполнялись - итеративно или с использованием кеш-таблицы.
Вопрос в том, будут ли функциональные языки работать лучше и избежать повторных вычислений при рекурсивной реализации функции, подобной приведенной выше?