我正在尝试在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>'
答案 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