Если вы пытаетесь произвести впечатление на своего инструктора, я бы использовал подход кеша памяти.Это значительно быстрее, чем подход, описанный Sjoerd.
Рассмотрим эту реализацию
fib[0]:=1
fib[1]:=1
fib[n_]:= (fib[n]=fib[n-1]+fib[n-2])
Давайте сравним их, просто чтобы доказать мою точку зрения.
slowfib[0]:=1
slowfib[1]:=1
slowfib[n_]:=slowfib[n-1]+slowfib[n-2]
Вотсравнение во время выполнения:
Map[fib, Range[30]] // AbsoluteTiming
{0.000158, {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025,
121393, 196418, 317811, 514229, 832040, 1346269}}
Map[slowfib, Range[30]] // AbsoluteTiming
{6.582185, {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025,
121393, 196418, 317811, 514229, 832040, 1346269}}
Время выполнения намного выше, потому что рекурсивная функция
fib[n_]:=fib[n-1]+fib[n-2]
генерирует n ^ 2 рекурсивных вызова (запишите это на бумаге, если этого не произойдетимеет смысл).С другой стороны, определение
fib[n_]:= fib[n]=fib[n-1]+fib[n-2]
использует преимущества кэширования памяти для вычисления терминов, что приводит к значительно более быстрому времени выполнения, поскольку каждый вызов генерирует кэшированное значение для fib [x].