如果... eql?...语句之后的奇怪行为

时间:2012-09-25 16:37:02

标签: ruby

我是Ruby的新手,正在尝试做一个简单的练习。 我需要在数组中找到最长的对称范围。 我的代码是:

index_start = index_end = nil
max_length = 0
array = [1,2,3,4,5,6,6,5,4,3,2,1]
length = array.length
array.each_with_index do |outer_element, outer_index|
  array.reverse.each_with_index do |inner_element, inner_index|
    if outer_element.eql? inner_element
      end_index = length - 1 - inner_index
      tmp_array = array[outer_index..end_index]
      if tmp_array.eql? tmp_array.reverse and max_length < tmp_array.length
        index_start, index_end = outer_index, end_index
        max_length = tmp_array.length
      end
    end
  end
end
print max_length, "\n"
print index_start,' ', index_end, "\n"
unless max_length.eql? 0
  print array[index_start..index_end]
end

问题在于:在内循环的第二次迭代之后,inner_index变量等于11,而它必须为1,这发生在if outer_element.eql? inner_element语句之后。

我对我做错了有点困惑。

请原谅我的英语和Ruby,我对两者都不熟悉。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

你错过了

max_length = tmp_array.length

在您找到新的最长对称子阵列的情况下。

使用当前代码,max_length始终为0,最后一个单元素子阵列([1])对称且长于0。

所以代码应该是:

...
if tmp_array.eql?tmp_array.reverse and max_length < tmp_array.length
  index_start, index_end = outer_index, end_index
  max_length = tmp_array.length
end
...