在Ruby中编写这个的更好方法?

时间:2011-10-04 23:07:40

标签: ruby

我是Ruby的新手。经过大量的重构后,我来到了这里。有没有更好的方法来写这个?

 51   def tri_num?(n)
 52     i = 1
 53     while i < n
 54       return i if i * (i + 1) / 2 == n
 55       i += 1
 56     end 
 57     raise InvalidTree
 58   end

4 个答案:

答案 0 :(得分:5)

直接解决它怎么样?

def tri_num? n

  i = (0.5*(-1.0 + Math.sqrt(1.0 + 8.0*n))).to_i

  if i*(i+1)/2 == n
    return i
  else
    raise InvalidTree
  end

end

虽然我不知道tri_num?是否是一个好名字。通常一个以?结尾的函数?应该返回truefalse

答案 1 :(得分:3)

def tri_num?(n)
  1.upto(n-1) do |i|
    return i if i * (i + 1) / 2 == n
  end
  raise InvalidTree
end

答案 2 :(得分:2)

我认为和dantswain一样,基本上颠倒了等式:

=> i * (i + 1) / 2 = n
=> i * (i + 1) = 2*n
=> i^2 + i = 2*n
=> i^2 + i -2*n = 0

以上的解决方案是:

i = (-1 +- sqrt(1+8n))/2

这里我不考虑-解决方案,因为它会给n大于0的任何值带来负数,最后代码为:

def tri_num?(n)
    i = (-1 + Math.sqrt(1 + 8*n))/2.0
    return i.to_i if i == i.to_i
    raise InvalidTree
end

答案 3 :(得分:0)

def tri_num?(n)
  (1...n).each do |i|
    return i if i * (i + 1) / 2 == n
  end
  rails InvalidTree # not defined..                                             
end