ruby - 堆栈级别太深 (SystemStackError) DFS
问题描述
我stack level too deep
在执行DFS 算法以查找最大组件时遇到问题。问题是我正在将 map(.osm) 文件转换为图形。我想找到最大的组件。但是,使用小地图(缩放更大)它可以工作,但是使用更大的图表它会给我以上状态错误,你能帮我吗?这是导致问题的我的 DFS 代码:
def dfsFunction (vertex)
@dfs[vertex] = true
@component[@componentIndex] << vertex
adjectenVertices = []
@edges.each do |edge|
if edge.v1.id == vertex.id
adjectenVertices << edge.v2
elsif edge.v2.id == vertex.id
adjectenVertices << edge.v1
end
end
adjectenVertices.each_with_index do |vertex|
if @dfs[vertex] == false
dfsFunction(vertex)
end
end
end
@dfs = {}
@vertices.each do |id,vertex|
@dfs[vertex] = false
end
@component = {}
@componentIndex = -1
@dfs.each do |vertex, boolean|
if @dfs[vertex] == false
@componentIndex = @componentIndex +1
@component[@componentIndex] = []
dfsFunction(vertex)
end
end
解决方案
MRI 默认关闭尾递归优化。但有人可能会打开它:
RubyVM::InstructionSequence.compile_option = {
tailcall_optimization: true,
trace_instruction: false
}
此外,代码本身必须使用尾递归,如:
def test(v)
return unless v > 0
p v
test(v-1)
end
代替:
def test(v)
test(v-1) if v > 0
p v
end
推荐阅读
- c - 为什么 strcpy 在写入较短的数组时不会导致分段错误?
- java - 已为此响应调用 Tomcat 8.5 response.getWriter()
- android - Android如何用rows和col span实现这种类型的布局
- java - 错误:收缩时发现警告,请使用 -dontwarn 或 -ignorewarnings 抑制它们
- javascript - 无法按在 Object.keys() 中可见的名称访问对象属性
- angular - 代码共享 nativescript 和 Angular 材质对话框
- javascript - 我可以导入 node-postgres 模块(pg)还是只导入 CommonJS?
- php - 在数组中添加 $my_elements 的问题
- c# - 将整数插入Excel工作表
- react-native - 如何使用网络服务拍摄图像?