В Мышление функционально в Haskell (стр. 213) показаны две версии циклического списка. Один оценивает в квадратичное время:Оценка предложения where в циклических списках
iterate3 f x = x:map f (iterate3 f x)
iterate3 (2*) 1
= 1:map (2*) (iterate3 (2*) 1)
= 1:2:map (2*) (map (2*) (iterate3 (2*) 1))
= 1:2:4:map (2*) (map (2*) (map (2*) (iterate3 (2*) 1)))
Другой, который использует where
, оценивает линейное время:
iterate2 f x = xs where xs = x:map f xs
iterate2 (2*) 1
xs where xs = 1:map (2*) xs
= 1:ys where ys = map (2*) (1:ys)
= 1:2:zs where zs = map (2*) (2:zs)
= 1:2:4:ts where ts = map (2*) (4:ts)
Я не совсем понимаю эту оценку. Как x переназначается для каждого последующего элемента списка вместо 1 (как в первой версии)?
Спасибо! Для меня поиск правильной визуализации часто является самым большим препятствием для понимания рекурсии. – planarian
Один вопрос о последующем: Производит ли iterate3 циклический список? В этом вопросе текст немного неоднозначен. – planarian
@planarian Я бы сказал, что сам список не имеет циклов - независимо от того, сколько его вы оцениваете, вы не будете «возвращаться» к предыдущему элементу, но вы можете утверждать, что его определение имеет один. (То есть, это «циклическое определение списка», но не «определение циклического списка».) – molbdnilo