Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 深度优先搜索(堆栈还是递归?)_Java_Graph_Stack_Depth First Search - Fatal编程技术网

Java 深度优先搜索(堆栈还是递归?)

Java 深度优先搜索(堆栈还是递归?),java,graph,stack,depth-first-search,Java,Graph,Stack,Depth First Search,对于DFS,是否始终必须使用堆栈?在做了一些研究之后,我看到一些人实现了递归而不是堆栈迭代,并且似乎得到了相同的结果 一个比另一个更有效率吗?很多递归算法都使用二级甚至有时是三级的辅助方法来递归运行 我在问,因为我必须在图形上使用DFS,我一直在尝试递归,我想我几乎成功了,但我对任何错误都很谨慎。我认为,递归是执行深度优先搜索的更具可读性的方法,因为您的代码执行正是遵循您正在实现的理念。另一方面,递归有一定的风险,因为它使用调用堆栈,调用堆栈是内存的一部分,与存储堆栈数据结构的位置不同,并且大小

对于DFS,是否始终必须使用堆栈?在做了一些研究之后,我看到一些人实现了递归而不是堆栈迭代,并且似乎得到了相同的结果

一个比另一个更有效率吗?很多递归算法都使用二级甚至有时是三级的辅助方法来递归运行


我在问,因为我必须在图形上使用DFS,我一直在尝试递归,我想我几乎成功了,但我对任何错误都很谨慎。

我认为,递归是执行深度优先搜索的更具可读性的方法,因为您的代码执行正是遵循您正在实现的理念。另一方面,递归有一定的风险,因为它使用调用堆栈,调用堆栈是内存的一部分,与存储堆栈数据结构的位置不同,并且大小有限。如果搜索太深,将触发
stackoverflowerrror
s并终止执行


深度限制很难说,因为每个递归步骤所需的内存量取决于递归方法参数的数量和类型,我认为调用堆栈的大小在不同的JVM版本和供应商之间有所不同。

递归还使用一个堆栈-调用堆栈。有趣。是的,递归似乎是一种更简单的方法,加上对于我的实现,我实际上没有使用堆栈,我只是转到图中的下一个节点,然后使用布尔值数组进行回溯,检查节点是否被访问。如果使用递归,则使用调用堆栈。这正是Java中递归的定义。在递归中,有一个方法调用自己。翻译成Java,表示您在调用堆栈上有一个方法,将其自身置于其自身之上的调用堆栈上。@FilipKłosiewicz请参见