Это то же самое, что и ответ Джири, но, возможно, немного более прямой: любая разрешимая вычислительная проблема разрешима машиной Тьюринга, и я не думаю, что кто-то мог бы описать функционирование машины Тьюринга как "рекурсивное" , но как на основе государства. Другими словами, при наличии достаточного количества вспомогательного накопителя на магнитной ленте, цикла while и регистра выбора (или эквивалентного ветвления, например, если / else, конструкция), вы можете решить любую проблему - включая эти проблемы перечисления - используя подход, основанный на автомате состояний .
Например, довольно просто определить основанный на состоянии алгоритм для выполнения обхода в порядке двоичного дерева поиска.
Начать в состоянии DL (вниз-влево). Если вы находитесь в DL и если у узла есть левый потомок, перейдите к нему и оставайтесь в состоянии DL; в противном случае выведите содержимое узла и, если у узла есть правильный дочерний элемент, перейдите в состояние DR и перейдите к правому дочернему элементу; если у узла нет правого потомка, перейдите в состояние UR и перейдите к родителю.
Если в штате DR и у вас есть левый ребенок, перейдите к левому ребенку и перейдите в состояние DL. В противном случае, если у вас есть правильный дочерний элемент, распечатайте содержимое узла и перейдите к дочернему элементу и оставайтесь в DR. В противном случае перейдите к родительскому узлу и перейдите в состояние UL.
Если в состоянии UR выведите информацию об узле и, если есть правильный дочерний элемент, перейдите к нему и измените состояние на DR; в противном случае перейдите к родителю и оставайтесь в UR.
Если в состоянии UL, если текущий узел является правым потомком своего родителя, оставайтесь в UL и переходите к родителю; в противном случае, если текущий узел не является правым дочерним элементом родительского элемента и является левым дочерним элементом, перейдите в состояние UR и перейдите к родительскому элементу. Если у этого узла нет родителя, завершите алгоритм.
В любом случае, вы поняли идею. Упорядоченные обходы деревьев примерно так же естественны, как и вы; многие (все?) другие проблемы обхода могут быть рассмотрены с точки зрения обхода некоторого дерева, и вот метод выполнения обхода по порядку за линейное время с использованием конечного автомата. Вы верите, что этот метод O (n)? Подсказка: он посещает каждый узел не более трех раз.