Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
ruby trie实现参考问题_Ruby_Algorithm_Data Structures_Tree_Trie - Fatal编程技术网

ruby trie实现参考问题

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"] 如果我传递字符串,那么: 有没有办法解决这个问题 守则

我正在尝试在Ruby中实现一个trie,但无法找出我的print+collect方法的问题所在

我只是在JS中实现了同样的功能,并且工作得很好。我猜问题可能是Ruby是通过引用传递的,不像JS,变量赋值在Ruby中是如何工作的

因此,如果在递归调用collect函数时以string.clone作为参数运行代码,则会得到:

["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)