2015-11-10 108 views
0

我想写一个需要3个参数(贷款金额,利率和每月支付)的递归方法。利息每月复利。目标是找出完全偿还贷款需要多少个月。下面是代码我迄今为止:贷款计算的递归方法

public static double loanLength(double loan, double interest, double payment) { 
    if (payment > loan + loan * interest) { 
     return 0; 
    } else { 
     double completeLoan = loan + (loan * interest); 
     double stillOwe = completeLoan - payment; 
     if (stillOwe <= 0) { 
      return 1; 
     } else { 
      return 1 + (loanLength(stillOwe, interest, payment)); 
     } 

    } 
预期回报的

实例包括:

loanLength(1000,0.10,200)6个月还清

loanLength(0 ,0.90,50)是0个月

但我的回报是这样的:

loanLength(1000,0.10,200):10个月

loanLength(0,0.90,50):0个月

我的第二测试工作正常,但我的第一个是上面刚刚1整数它应该是什么。我无法弄清楚为什么。任何帮助表示赞赏。

+0

我不认为这是递归的最佳情况。循环会更容易阅读(和写)。跳过这个计算可以在单个表达式中完成的事实。这只是练习递归练习吗? –

+0

命名参数将使代码可读! – Andreas

+0

@JaroslawPawlak这是为了练习递归地完成的。我可以很容易地以循环的形式做到这一点,但我肯定会在递归方面挣扎。 –

回答

3
public static int loanLength(double loan, double interestAPR, double payment) { 
    if (loan <= 0) { 
     return 0; 
    } 
    double monthlyInterest = interestAPR/(12 * 100); 
    double compounded = loan * (1 + monthlyInterest); 
    return 1 + loanLength(compounded - payment, interestAPR, payment); 
} 

public static void main(String[] args) { 
    System.out.println(loanLength(0, 0.90, 50)); // 0 
    System.out.println(loanLength(1000, 10.0, 200)); // 6 
    System.out.println(loanLength(1000, 0.1, 200)); // 6 (FWIW) 
} 

请注意,兴趣APR表示为是,即计算$ 10,000的贷款在10%的年利率和$ 500每月付款为

loanLength(10000, 10.0, 500); 

如果0.10 = 10%的年利率,则改变这条线

double monthlyInterest = interestAPR/12; 
+0

干得好,我一直试图自己编码,这是非常好的 –

+0

你为什么也被100除?看起来他的输入已经被表示为十进制... 0.10 = 10%APR? –

+0

@JeremyWest - 因为这是[转化率](http://smallbusiness.chron.com/convert-annual-interest-rate-mon-th-rate-rate-1822.html) –