Я игрался с языком wolfram и кое-что заметил: одна и та же функция, написанная по-разному, работает очень по-разному с точки зрения времени.
Рассмотрим эти две функции:
NthFibonacci[num_] :=
If [num == 0 || num == 1, Return[ 1],
Return[NthFibonacci[num - 1] + NthFibonacci[num - 2]]
]
Fibn[num_] := {
a = 1;
b = 1;
For[i = 0, i < num - 1, i++,
c = a + b;
a = b;
b = c;
];
Return [b];
}
Для оценки NthFibonacci[30]
требуется около 5 секунд.
Для оценки Fibn[900 000]
также требуется около 5 секунд.
Так же, как и для встроенной функции Fibonacci[50 000 000]
.
Я просто не могу понять, почему такая разница в скорости между тремя. Теоретически рекурсия должна быть более или менее эквивалентна циклу for. Чем это вызвано?