1

我正在将一个单词与另一个字符串进行比较,该字符串通过遍历字母表并将每个字母插入单词的每个位置而发生变化。

@position_counter = 0

编辑:这是 letter_loop 正在运行的代码。

@array = ["amethod", "variable", "block"]

def word_list_loop
  @match_counter = 0
  @array.each do |word|
    letter_loop(word)
  end
  puts @match_counter
end

关闭编辑

def letter_loop(word)
  ("a".."z").each do |letter|
     word_plus_letter = @word.dup
     word_plus_letter.insert(@position_counter, letter)
     @match_counter+=1 if word.match(/\A#{word_plus_letter}\z/)
  end
  @position_counter+=1
  letter_loop(word) unless @position_counter == (@word.length + 1) 
end

我用于论证的词是"method". 但是当我运行它时,我得到一个index 7 out of string (IndexError). 它正确地循环遍历每个位置的字母表,但似乎并没有被unless @position_counter == (@word.length + 1)to 结尾抓住。

我尝试了其他一些方法,例如使用 if 语句等,但我无法让该方法自行完成。

4

2 回答 2

1

你跑了多少次letter_loop?您确定错误发生在第一次运行中吗?据我所知,如果您第二次调用它而不重置@position_counter为零,它将开始@word.length + 1产生您看到的确切错误。除此之外,我找不到您的代码有任何问题(第一次运行时在这里运行得很好)。

更新:由于您使用的是递归解决方案,并且position_counter不代表您的程序的状态(只是您的方法调用的状态),我建议不要将其声明为,@position_counter而是作为您的方法的可选参数:

def letter_loop(word, position_counter=0)
  ("a".."z").each do |letter|
     word_plus_letter = @word.dup
     word_plus_letter.insert(position_counter, letter)
     @match_counter+=1 if word.match(/\A#{word_plus_letter}\z/)
  end
  position_counter+=1
  letter_loop(word, position_counter) unless position_counter == (@word.length + 1) 
end

如果您不能/不想这样做,只需在每次使用之前/之后重置它,就像我之前建议的那样,它会正常工作:

@array.each do |word|
  @position_counter = 0
  letter_loop(word)
end

(尽管我不推荐第二种方法,因为如果您忘记在其他地方重置它,您的方法将再次失败)

于 2012-09-15T03:49:58.657 回答
0

我认为问题在于您是从 inside 调用letter_loop@array.each,但您不会在循环@position_counter的每次迭代中重置为零@array.each

如果这不能解决您的问题,请添加以下内容作为第一行letter_loop

puts "letter_loop word=#{word}, position=#{@position_counter}, matches=#{@match_counter}"

然后运行程序并检查导致IndexError.

于 2012-09-15T07:06:34.063 回答