计算转换函数错误

时间:2015-05-20 19:15:04

标签: ruby finite-automata

我正在尝试在ruby中实现这个转换函数算法。

以下是算法:

Compute-Transition-Function(P, Σ);
  m := |P|
  for q=0 to m
    for each a∈Σ
      k := min(m + 1, q + 2)
      repeat
        k=k−1
      until (Pk ⊐ Pqa)
      δ(q, a) := k
return δ

以下是我迄今为止在ruby中所做的事情:

def compute_transition_function(pattern, alphabet)
  m = pattern.length
  transition = Array.new()

  m.times do |q|
    alphabet.each do |c|
      k = [m+1, q+2].min
      while pattern[q+c][-k] != pattern[k]
        k -= 1
      end
      transition[q][c] = k
    end
  end

  return transition
end

这是我编译时得到的。

finiteautomatamatcher.rb:54:in `+': String can't be coerced into Fixnum (TypeError)
from project.rb:54:in `block (2 levels) in compute_transition_function'
from project.rb:52:in `each'
from project.rb:52:in `block in compute_transition_function'
from project.rb:51:in `times'
from project.rb:51:in `compute_transition_function'
from project.rb:82:in `<main>'

2 个答案:

答案 0 :(得分:0)

我认为问题出在c。字母表示mi是一个字符串数组,我是否正确?如果是这样,您将始终收到错误,因为String未实现+方法。您可能应该将这些字符串转换(ASCII号?)为数字。

答案 1 :(得分:0)

没有深入了解该函数的细节,修复此错误:

`+': String can't be coerced into Fixnum (TypeError)

在尝试添加to_i之前,您需要使用+将字符串转换为Fixnums。由于没有足够的代码来了解正在使用的数据类型,因此可能的代码更改(假设c是字符串):

while pattern[q+c.to_i][-k] != pattern[k]
  k -= 1
end