LINUX.ORG.RU

рекурсивная => нерекурсивная реализация

 


1

4

любая рекурсия может быть привращена в итеративную запись, правильно? (тезис Черча)

подскажите алгоритм, который умеет символьно производить такую операцию, например для языков Java/C/C++ ? Может кто-то уже налабал готовый тул?

причина вопроса в том, что некоторые вещи интуитивно записывать именно в рекурсивной форме, а в указанных языках рекурсией пользоваться небезопасно (= нельзя)

ps, наверное такую ересь сейчас ляпнул xD Если б такой тул существовал, создатели этих языков давно бы уже бы его туда запилили, они ж не школьники как ТС

★★★★☆

Последнее исправление: maxcom (всего исправлений: 2)
Ответ на: комментарий от qulinxao

Начал , так довони до конца!111!!

Лень руками делать. А компилятор выдает огромных размеров лапшу.

покажи без рекурсии. (и без своего стека, ибо фортран"60" уже изобрели)

Это как это «без своего стека»? Я тебе такого не обещал. Я обещал избавиться от любых вызовов функций, а стек из lambda lifting тут вылезает, никуда его не денешь.

anonymous
()
Ответ на: комментарий от anonymous

ЗЫ: однако, прошу заметить, что размер этого стека будет меньше чем при рекурсии в лоб, поскольку только один из вызовов будет сохранять значения локальных переменных. Ну и стек может быть на хипе, а не в машинном стеке, чего ТС, собстенно, и хотел.

anonymous
()
Ответ на: комментарий от anonymous

Это как это «без своего стека»? Я тебе такого не обещал.

То есть, ты предлагаешь заменить нативный стек своим, и это с твоей точки зрения сделает решение итеративным?

anonymous
()
Ответ на: комментарий от anonymous

То есть, ты предлагаешь заменить нативный стек своим, и это с твоей точки зрения сделает решение итеративным?

Ну да ну да, итеративная функция, использующая для промежуточных значений std::vector<...> магически превращается в «рекурсивную», потому что а вдруг этот вектор на самом деле используется как стек?

anonymous
()
Ответ на: комментарий от Waterlaz

код итеративный.

структуры данных - конечные (т.е. без эмуляции стека на массиве или прочих списках)

насколько понимаю при таких вводных ограничениях придёться обмазываться самомодифицирующимися кодами либо реализовывать свой интерпретатор промежуточного языка :)

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Ну, если мне нельзя выделять память, то я мало чего смогу реализовать вообще. А если таки можно, то я сомневаюсь, что можно дать формальное определение эмулируется в программе стек или нет. А без формального определения и говорить не о чем =)

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

что можно дать формальное определение эмулируется в программе стек или нет

Да что ты говоришь. стопка тарелок, пуш поп, не не слыхали. может и у самого стека формального определения нет? Вон хашкелист вверху думает, что все есть только машинные коды.

nuboquest
()
Ответ на: комментарий от Kuzy

Не, просто тупой молчал бы и пускал слюни. А этот шизофреник очень буйный.

anonymous
()
Ответ на: комментарий от nuboquest

Да что ты говоришь. стопка тарелок, пуш поп, не не слыхали. может и у самого стека формального определения нет? Вон хашкелист вверху думает, что все есть только машинные коды.

Тогда дай определение. Программа на языке X эмулирует стек, если....

Waterlaz ★★★★★
()
Ответ на: комментарий от Kuzy

То есть, ты считаешь, что анон которому ты отвечал, у которого «аккерман» на схеме с готу, умен? Ну, вы нашли друг друга, поздравляю!

anonymous
()
Ответ на: комментарий от Waterlaz

Ты, для начала, объясни разницу, стек на уровне реализации, или самодельный, в чем ты видишь разницу?

anonymous
()
Ответ на: комментарий от anonymous

Тупо - самодельный не может вызвать stack overflow, если таковой имеется в твоей целевой платформе.

anonymous
()
Ответ на: комментарий от Waterlaz

если в программе есть «переменная» типа чья мощность счётная бесконечность.

т.е. по такому определения целые числа питона того же есть стеки.

есть же теорема о возможности построения машины на 2ух переменных.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Не, ты все таки, ИМХО, влез в какие то левые «материи». Стек — это просто, это структура данных типа: последним зашел, первым вышел.

nuboquest
()
Ответ на: комментарий от nuboquest

Так ты не ответил, как ты будешь обходить все элементы двоичного дерева за O(1) памяти.

anonymous
()
Ответ на: комментарий от qulinxao

Это неважно. Наш шизофреник пытается свести тему к тому, как любой алгоритм, использующий память, переписать так, чтобы память ему волшебным образом была вообще не нужна. Что явно не имеет уже ни малейшего отношения к постановке вопроса ТСа.

anonymous
()
Ответ на: комментарий от anonymous

Ты, для начала, объясни разницу, стек на уровне реализации, или самодельный, в чем ты видишь разницу?

Не хочу, мне все равно. Мне интересно, в чем разница между «программа эмулирует стек» и «программа не эмулирует стек».

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

Да нет никакой разницы, разве что, в нативной реализации манипуляции со стеком оптимизированы, есть нативная ошибка, stack overflow, которую, впрочем, тоже можно запилить. С концептуальной точки зрения нет разницы.

nuboquest
()
Ответ на: комментарий от nuboquest

мальчик. я сегодня уже говорил куда тебе пойти со своей скриптотой.

stack overflow — это у жабоедов на их жаба-«процессоре». у чотких пацанов на x86 segmentation fault, bus error, illegal instruction и т.д. на других платформах — аналогично.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.