【发布时间】:2017-02-17 11:24:24
【问题描述】:
如何使用 ruby 中的二分法找到 2 dp 的最低固定月供以偿还 12 个月的复利余额?
免责声明:我正确地应用了 upperBound 和 unpaidBalance 公式。
测试用例:
find_fixed_payment(320000, 0.2) should return 29157.09
但是我当前的方法返回的中间值是 29591.87,这对于固定支付来说已经绰绰有余了(需要减少到最低)。
我的代码哪里出错了,因为我不确定如何进行二分(我使用二进制搜索)?
def find_fixed_payment(balance,annualInterestRate)
lowerBound = balance/12
upperBound = (balance * (1 + annualInterestRate/12)**12) / 12.0
unpaidBalance = balance
while true
middle = (lowerBound + upperBound )/2
#use middle as the monthly payment at first
(1..12).each do |i|
unpaidBalance = (unpaidBalance - middle) +
annualInterestRate / 12 * (unpaidBalance - middle)
end
temp = unpaidBalance.floor
if temp < 0
middle -= 0.01
upperBound = middle
# should go to for loop to reduce unpaid balance
# with new middle but not happening, why?
else
middle += 0.01
lowerBound = middle
end
if temp == 0
return middle
end
if upperBound == lower+1
return -1
end
return middle.round(2)
end
end
【问题讨论】:
-
@mudasobwa 对我来说,代码看起来并不像一团糟,不管用“整个代码都是一团糟”开头的其他有用的评论都是适得其反和卑鄙的。
-
@Jordan
while true而不是loop⇒ 滥用each,更新内部的外部局部变量⇒ 未使用|i|⇒ DRY 违反(unpaidBalance - middle)⇒ 冗余temp变量⇒三个if分支而不是case的范围⇒ 奇怪的+0.01为temp.zero?⇒ 三个后续的returns:: 所有这一切让我阅读这段代码的时间比不凌乱的代码要长十倍。以上是OP没有发现问题的原因,我只是指出了这一点。 -
@mudasobwa 不管怎样,用“整个代码都是一团糟”来开头有用的评论会适得其反,而且是卑鄙的。一个小时后解释为什么你认为这是一团糟并不能原谅最初的行为。