1

我刚刚做了以下代码。我在语法和模式上看到了很多重复(比如一次又一次地使用临时变量 r,并在它不是 nil 时附加字符串)。我怎样才能使这个更干燥?我来自 C 背景,只是想学习 Ruby 的抽象和简化方法以获取优雅的代码......

# Traverse a matrix spirally

def subm(m)
  result=[]
  if m.length>1
    m[1..-2].each {|a| result << a[1..-2]}
  end
  result
end

def trav_sp(m)
  result=[]
  if not m.empty?
    result += m[0] if m[0]

    r=[]
    m[1..-1].each {|a| r << a[-1]} if m[1..-1]
    result += r

    r=[]
    if m[-1]
      m[-1].each_with_index{|a,i| (r<< m[-1][-2-i] if m[-1][-2-i])}
      result += r
    end

    r=[]
    m.each_with_index {|a,i| (r<< m[0][-2-i] if m[0][-2-i])}
    result += r

    return result = result + trav_sp(subm(m))
  else
    return result
  end

end
4

1 回答 1

1

您可以使用map而不是重复向临时数组添加元素,以及其他一些更改:

# Traverse a matrix spirally

def subm(m)
    m[1..-2].map {|a| a[1..-2]}
end

def trav_sp(m)
    result = []

    if not m.empty?
        result += m[0] if m[0]
        result += m[1..-1].map {|a| a[-1]} if m[1..-1]

        r = []
        if m[-1]
            m[-1].each_with_index{|a,i| (r<< m[-1][-2-i] if m[-1][-2-i])}
            result += r
        end

        r = []
        m.each_with_index {|a,i| (r << m[0][-2-i] if m[0][-2-i])}
        result += r

        result += trav_sp(subm(m))
    end

    result
end
于 2012-08-04T01:19:06.870 回答