Все это верно, но это же не имеет отношения к примеру о цепочках из учебника по Р+. Рекурсия там - не хвостовая. И как писал Юра (26.02): <<< Пример с двумя iter из документации в приложении. Требует heap'а чуть поменьше (1ГБ против 2ГБ). Считает 10.5 секунд. >>> Значит, все-таки требует ГБ heap-a. А для чего? Не для стека ли? Не буквально на стек, конечно, но на значения переменной e.String, "ссылаемые" из стека. Так? Но эти выражения ведь просто растут в одну сторону вместе со стеком. А почему же тогда здесь не получается их создавать на одном общем массиве "с открытым концом"? В варианте EX2 ровно это фактически и происходит. Значит, в принципе возможно. А почему не получается "само"? Хотелось бы понять, что там на самом деле происходит (с "дырками" слева-справа) и что мешает. И возможно ли это преодолеть в автоматическом режиме. Аркадий
сб, 2 мар. 2019 г. в 09:39, Anton Orlov orlovan_AT_gmail.com <refal@botik.ru >: > On Fri, Mar 1, 2019 at 4:08 AM Sergei M. Abramov abram_AT_botik.ru < > refal@botik.ru> wrote: > >> День добрый, Антон, Юра! >> >> Я там как-то невнимательно следил. >> >> 1. Р+ с $iter должен быт лучше (не хуже) чем рекурсия. Но не сильно >> (хвостовая рекурсия мало уступает $iter). >> > > $iter не хуже, чем хвостовая рекурсия. Но, конечно, может быть хуже, если > пытаться выразить не хвостовую рекурсию и эмулировать стек на > рефал-выражениях, например. > > Вообще, на мой взгляд, $iter оправдан по двум причинам: > 1) Ситуации, когда рекурсия по сути хвостовая, но не является таковой > из-за смежных конкатенаций: (e1 <F e2>) > 2) Отсутствие вложенных функций/замыканий. Выносить каждый простой > внутренний цикл во внешнюю функцию (передавая туда все нужные локальные > переменные) -- слишком тяжеловесно. > > >> 2. Р+ с рекурсией не должен жрать стек (точнее, жрать и освобождать >> сразу, так как хвостовая). >> >> Так и есть? А если не так, то поясните, плз. >> > > Так и есть. > > Антон > > >> >> Всего доброго, >> >> Сергей Абрамов >> >> -- _______________ *С уважением, * *Аркадий Климов,* *с.н.с. ИППМ РАН,* *+7(499)135-32-95* *+7(916)072-81-48*