我是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
答案 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?
是否是一个好名字。通常一个以?结尾的函数?应该返回true
或false
。
答案 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