我正在尝试将搜索树中的值保存在数组中,但是如果没有全局变量,我就无法做到这一点。如果可能的话,我想保留递归。
$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=>{}}}}}}
如何在不使用全局变量的情况下将值保存在数组中?
提前感谢您的所有答案。
您可以将变量传递给方法并返回它:
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
因为默认有一个空数组。
正如另一个答案所建议的那样,默认参数是避免全局变量的好方法。您还可以使用实例变量:
@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
(这可能会收紧一点,以避免对空哈希进行如此多的检查。