2015-11-10 127 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) –