Мне интересно, можно ли переопределить какую-либо рекурсивную реализацию алгоритма как перемещение графика DFS.Рекурсия и эквивалент DFS?
ответ
Нет, вот алгоритм, для которого вы не найдете пересечения DFS.
func A(graph):
if graph is empty:
stop
print random vertex from a graph
func A(grap without this vertex)
Это, очевидно, некоторый рекурсивный алгоритм на графике. Попробуйте найти DFS, который сделает что-то подобное.
Итак, общеизвестно, что некоторые рекурсивные алгоритмы могут быть переписаны как итеративная версия DFS? –
@ChristianLeon DFS означает, что вы перемещаетесь от элемента к его элементу. Рекурсия означает, что вы определяете что-то через это. Рекурсия намного шире, чем DFS. –
Я думаю, вы могли бы рассматривать множество рекурсивных алгоритмов как DFS. Вопрос в том, что вы считаете графиком, на котором работает DFS.
Например, если у вас есть повторение типа
f(n1,...,nk)=G(f(n1',...nk'), f(n1'',...,nk''),...)
Каким должен быть график? Если вы понимаете конфигурации (n1,...,nk)
как вершины графика и выражаете зависимость конфигурации (n1,...nk)
от конфигураций (n1',...,nk')
, (n1'',..., nk'')
, ...
, поскольку направленные ребра между этими вершинами, чем расчет повторения и DFS на этом графике, будут эквивалентны.
Например, для чисел Фибоначчи f(n)=f(n-1)+f(n-2)
, f(n)
будет зависеть только от одного аргумента (поэтому пишу n
для n1
). Операции G
будут сумма: G(f(n-1), f(n-2)):=f(n-1)+f(n-2)
В формирующемся абстрактном графе, вершина будет {0,1,2,3,4,...}
и край будет {(2,0), (2,1), (3,1), (3,2), ...}
.
DFS использует memoization и вычисляет значение для конфигурации только один раз. Это не верно для каждого повторения (классический пример - наивная реализация чисел Фибоначчи), однако каждое повторение может быть расширено для использования memoization.
Что касается контрпримера Сальвадора, то, если мы понимаем параметр функции A
как вершину (несмотря на то, что ее называем «графом»!), То A
можно рассматривать как DFS (довольно скучно, потому что каждый узел имеет ровно один исходящий край, хотя и случайный).
Я знаю, мой ответ не является доказательством, но я надеюсь, что вы можете понять, почему повторение можно рассматривать как DFS.
- 1. DFS деревья и леса DFS
- 2. Алгоритмы, DFS
- 3. DFS в DFS, DFS с известной строкой
- 4. DFS и стек
- 5. DFS и замена for_each
- 6. Выходы DFS и BFS?
- 7. DFS обнаружения и окончания
- 8. DFS Recursive vs DFS Iterative
- 9. Разница между «hdfs dfs -ls» и «hdfs dfs -ls /»
- 10. «и» и рекурсия хвоста
- 11. Представление и рекурсия графика/дерева
- 12. Упорядочивание и объединение двух DFS
- 13. Разница между BFS и DFS
- 14. Когда использовать DFS и BFS
- 15. Возможна ли DFS без рекурсии и дополнительного пространства
- 16. Рекурсия или не рекурсия
- 17. Итерация, рекурсия и умножение
- 18. Рекурсия и доходность возврата
- 19. Рекурсия и TreeNode xslt
- 20. Рекурсия и выполнение строки
- 21. Указатели и рекурсия
- 22. Алфавит и рекурсия
- 23. Scala и хвостовая рекурсия
- 24. Рекурсия и возвращает обслуживание
- 25. Рекурсия и статическая переменная
- 26. Рекурсия и исключения Java
- 27. Рекурсия и динамическое программирование
- 28. Python Рекурсия и список
- 29. Многопоточность и рекурсия
- 30. toString() метод и рекурсия
Вы можете реализовать dfs итеративно, используя стек. большинство реализаций используют стек вызовов функций, следовательно, рекурсию, в качестве альтернативы. в общем случае рекурсия не является dfs. – svs