... правильно ли говорить, что numSq
является изменяемой функцией?
Как отметил @gregghz в комментариях, «изменяемая функция» не является общепринятой терминологией . Это правда, что HashMap
находится в разном состоянии при каждом рекурсивном вызове, но это фактически невидимо для вызывающего.
... кажется, он отлично работает даже для некоторых больших входов. Это из-за использования lazy val
в определении numSq
?
No.
Переменная numSq
объявлена lazy
, чтобы разрешить полученную функцию рекурсивный. Без части lazy
компилятор жалуется на недопустимую прямую ссылку.
Error: forward reference extends over definition of value numSq
numSq
может обрабатывать большие входные числа, потому что мемоизация (память того, что уже было вычислено) уменьшает количество рекурсий требуется для вычисления следующего результата.
Обратите внимание, что вы можете получить StackOverflow, просто изменив направление Range
:
Range(2, math.sqrt(x).toInt + 1)...
Начав с малых чисел и увеличивая, HashMap
не будет содержать достаточно элементов, чтобы в достаточной степени уменьшить рекурсию, требуемую по мере роста чисел.