ruby trie实现参考问题
我正在尝试在Ruby中实现一个trie,但无法找出我的print+collect方法的问题所在 我只是在JS中实现了同样的功能,并且工作得很好。我猜问题可能是Ruby是通过引用传递的,不像JS,变量赋值在Ruby中是如何工作的 因此,如果在递归调用collect函数时以string.clone作为参数运行代码,则会得到:ruby trie实现参考问题,ruby,algorithm,data-structures,tree,trie,Ruby,Algorithm,Data Structures,Tree,Trie,我正在尝试在Ruby中实现一个trie,但无法找出我的print+collect方法的问题所在 我只是在JS中实现了同样的功能,并且工作得很好。我猜问题可能是Ruby是通过引用传递的,不像JS,变量赋值在Ruby中是如何工作的 因此,如果在递归调用collect函数时以string.clone作为参数运行代码,则会得到: ["peter", "peter", "petera", "pdanny", "pdjane", "pdjanck"] 如果我传递字符串,那么: 有没有办法解决这个问题 守则
["peter", "peter", "petera", "pdanny", "pdjane", "pdjanck"]
如果我传递字符串,那么:
有没有办法解决这个问题
守则:
class Node
attr_accessor :hash, :end_node, :data
def initialize
@hash = {}
@end_node = false
@data = data
end
def end_node?
end_node
end
end
class Trie
def initialize
@root = Node.new
@words = []
end
def add(input, data, node = @root)
if input.empty?
node.data = data
node.end_node = true
elsif node.hash.keys.include?(input[0])
add(input[1..-1], data, node.hash[input[0]])
else
node.hash[input[0]] = Node.new
add(input[1..-1], data, node.hash[input[0]])
end
end
def print(node = @root)
collect(node, '')
@words
end
private
def collect(node, string)
if node.hash.size > 0
for letter in node.hash.keys
string = string.concat(letter)
collect(node.hash[letter], string.clone)
end
@words << string if node.end_node?
else
string.length > 0 ? @words << string : nil
end
end
end
trie = Trie.new
trie.add('peter', date: '1988-02-26')
trie.add('petra', date: '1977-02-12')
trie.add('danny', date: '1998-04-21')
trie.add('jane', date: '1985-05-08')
trie.add('jack', date: '1994-11-04')
trie.add('pete', date: '1977-12-18')
print trie.print
Ruby会对字符串进行变异,不会返回新字符串。你可能会想要这个。因此,基本上更改collect for循环中的2行,如下所示:
stringn = string + letter
collect(node.hash[letter], stringn)
另外,您可能希望在调用collect之前总是在print中将@words初始化为空,或者在print中将其作为局部变量并将其传递给collect。。我必须同时更改新变量和使用+运算符。我只是分别尝试了这些解决方案。
stringn = string + letter
collect(node.hash[letter], stringn)