我正在尝试从数组中的搜索树中保存值,但如果没有全局变量,我就无法做到。如果可能的话,我想保留递归。
$array = []
def to_array(s)
if s != {}
$array << s[:value]
to_array(s[:left])
to_array(s[:right])
end
end
搜索树看起来像这样:
st1 = {:key=>2, :value=>0,
:left=>{},
:right=>{:key=>17, :value=>1,
:left=>{:key=>13, :value=>2,
:left=>{:key=>10, :value=>4,
:left=>{},
:right=>{:key=>11, :value=>5,
:left=>{},
:right=>{}}},
:right=>{:key=>14, :value=>6,
:left=>{},
:right=>{}}},
:right=>{:key=>22, :value=>3,
:left=>{},
:right=>{:key=>48, :value=>7,
:left=>{:key=>42, :value=>8,
:left=>{},
:right=>{}},
:right=>{:key=>77, :value=>9,
:left=>{},
:right=>{}}}}}}
如何在不使用全局变量的情况下保存数组中的值?
提前感谢所有答案。
答案 0 :(得分:1)
您可以将变量传递给方法并将其返回:
def to_array(tree, array = [])
unless tree.empty?
array << s[:value]
to_array(s[:left], array)
to_array(s[:right], array)
end
array
end
您可以在第一次递归中调用该方法而不先创建数组,因为array
默认为空数组。
答案 1 :(得分:0)
正如另一个答案所示,默认参数是避免全局变量的好方法。您还可以使用实例变量:
@array = []
def to_array(s)
if s != {}
@array << s[:value]
to_array(s[:left])
to_array(s[:right])
end
@array
end
如果您没有定义类,那么它将是main
对象下的变量。或者,您可以返回一个局部变量:
def to_array(s)
array = []
if s != {}
array << s[:value]
array << to_array(s[:left]) if s[:left] != {}
array << to_array(s[:right]) if s[:right] != {}
end
array.flatten
end
(这可能会收紧一点,以避免对空哈希进行如此多的检查。)