Такое никак не выйдет. Без циклов остаться не суждено.
В общем случае представляется следующее.
Если программа имеет конечное число входных состояний, то для каждого из них можно прописать "if smth then return f(smth)", в результате получаем программу типа B с конечным числом узлов. Но от такой программы толку ноль, все равно что в ленту тьюринга преобразовывать.
Возможно существуют какие-либо техники, позволяющие получить внятный результат.
Рекурсия. Функция с адресом исходного узла ищет соседние узлы и вызывает сама себя с адресом соседнего узла и т.д. Циклы не нужны.
ищет соседние узлы - это цикл, перебирающий узлы? имеется ввиду виртуальная машина на одном цикле?
на схемах в узлах графа различные блоки кода. т.е. два узла не обязательно равны друг другу по содержимому.
Зачем это?
Отдельная специфичная область.
Если мы имеем программу типа А, то однократный сбой в ней не приведет к многократному отказу (изменение тела цикла ведет к нескольким действиям, а изменение одного из них ведет к многократным изменениям в поведении).
Если программа типа B, то возможно локализировать места сбоев/отказов.
Как А, так и B можно автоматически конвертнуть в серию аппаратных элементов (OR, AND, NOT), или например задать в ПЛИС. Также их удобно выполнять параллельно.