2014-10-29 101 views
-2

這裏有一個問題,我希望能提高我的編程印章。我有這樣的循環,基於年費計算的未來之和,增加了利息和通貨膨脹貶值(它是從Excel中的PV函數導出):使用Math.pow()重構for()循環?

var pmt = 66,449.75 // annual payment 
var ip = 0.03 // interest rate 
var fv = 0 // future value, not require here 
var k = 1 // interest is applied at beginning/end of period 
var n = 25 // number of periods (years in this case) 
var ri = 0.025 // rate of inflation 
var pv = 0;  
for (var i = n - 1; i >= 0; i -= 1) { 
    pv = (pv + (pmt * k - fv) * Math.pow(1 + ri, i))/(1 + ip); 
} 

是否有可能使用Math.pow()重現這個循環在做什麼?

+3

您在每次迭代重建PV,要archieve什麼? – juvian 2014-10-29 17:24:26

+4

它在做什麼?我不是編譯器,你的變量命名無助於你的問題 – 2014-10-29 17:24:31

+3

需要更多的細節。如果這是實施特定的數學方法或算法,請添加關於哪一個(可能有完全不同的,更有效的實現以達到相同結果)的信息。另外請確保你的代碼解釋你的變量。如果這是一個複製粘貼,請花費額外的努力來重命名變量,以便我們能夠理解它們的用途,或者在您的帖子中解釋它們。如果沒有這些,'pmt','k','fv','ri'和'ip'可能是我們所知的所有常量,像'pmt * k-fv'這樣的東西在循環內部是沒有意義的。 – 2014-10-29 17:28:28

回答

0

爲了簡化,我重命名一些表情

a = pmt * k - fv; 
b = 1 + ri; 
c = 1 + ip; 
x = pv; 

所以,你的代碼變得

for (var i = n - 1; i >= 0; --i) { 
    x = x/c + a * Math.pow(b, i)/c; 
} 

然後

x_0 
x_1 = x_0/c + a b^{n-1}/c 
x_2 = x_1/c + a b^{n-2}/c = x_0/c^2 + a b^{n-1}/c^2 + a b^{n-2}/c 
... 
x_i = x_{i-1}/c + a b^{n-i}/c = x_0/c^i + \sum_{k=1}^i a b^{n-k}/c^{i-k+1} 
... 
x_n = x_0/c^n + \sum_{k=1}^n a * b^{n-k}/c^{n-k+1} 

WolframAlpha

x_n = x_0/c^n + a (b^n-c^n)/(c^n (b-c)) 

因此,而不是你的循環,你可以使用

var foo = Math.pow(1 + ip, n); // c^n 
pv = pv/foo + (pmt*k-fv) * (Math.pow(1+ri,n) - foo)/foo/(ri-ip); 
+0

感謝您的努力!但是,使用此代碼不會產生與以前相同的結果。道歉,但正如一些讀者指出的,我沒有提及可能是至關重要的細節 - 我現在已經在上面添加了。 – stylecramper 2014-10-29 19:58:03

+0

@stylecramper我犯了一個錯誤,現在修復了。 – Oriol 2014-10-29 20:19:33

+0

當我比較你們與我的並排時,你的代碼產生的值是125046905.28783791,而我的產量是184770003.67224348。 – stylecramper 2014-10-29 20:56:03