На прошлой неделе мне было задание в школе реализовать функцию для вычисления n-го числа в последовательности Фибоначчи. -assignment 'заключалась в том, чтобы реализовать его с использованием накопления (возможно, неправильный перевод), чтобы придать функции временной сложности O (n). Все это работало нормально, пока я не попытался создать функцию (Int -> Integer). бит я понял, что временная сложность была близка к O (n ^ 2) для действительно больших чисел. заключалось в том, чтобы реализовать его с использованием накопления (возможно, неправильный перевод), чтобы придать функции O (n) временную сложность. Все это работало нормально, пока я не попытался создать функцию (Int -> Integer). Немного поэкспериментировав, я понял, что временная сложность близка к O (n ^ 2) для действительно больших чисел. заключалось в том, чтобы реализовать его с использованием накопления (возможно, неправильный перевод), чтобы придать функции O (n) временную сложность. Все это работало нормально, пока я не попытался создать функцию (Int -> Integer). Немного поэкспериментировав, я понял, что временная сложность близка к O (n ^ 2) для действительно больших чисел. Мне приходит в голову, что это должно быть из-за реализации Integer, что заставляет меня немного интересоваться, как это работает. Я сделал несколько поисков в Google и не нашел ничего полезного, поэтому обращаюсь к вам, ребята, в надежде получить объяснение или ссылку, которая подробно объясняет это.
Мой код:
ackfib 0 = 0
ackfib 1 = 1
ackfib n = loop n 1 0 1
where
loop n n1 n2 i
| i < n = loop n (n1+n2) n1 (i+1)
| i == n = n1
| i > n = error "n must be greater than or equal to 0"
Я благодарен за все ответы
Viktor