2012-03-05 24 views
0

我確定你prefeer迭代函數限制爲limit(0)=0; limit(y)=2*1.08^(y-1), y∈{1,2,3,...,50}或如果:高效X

limit(0)=0 
limit(1)=2 
limit(y)=limit(y-1)*1.08, x∈{2,3,4,...,50} 

Exmples:

limit(1) = 2*1.08^0 = 2 
limit(2) = 2*1.08^1 = 2.16 
limit(3) = 2*1.08^2 = 2.3328 
... 

對於給定的x∈[0,infinity)我想要一種有效的公式來計算y使得limit(y)>x and limit(y-1)≤x或50,如果沒有。

任何想法? 或正在預先計算50個限制並使用幾個ifs來獲得最佳解決方案?

我使用erlang作爲語言,但我認爲它不會有太大區別。

+1

如何只解決'限制(Y)> x'分析了'y'用筆和紙? – 2012-03-05 12:26:52

+0

這就是我所說的「預先計算50個極限並使用幾個ifs」 – Daniel 2012-03-05 12:51:07

+0

沒有ifs需要,只是數學。 – Amadan 2012-03-05 12:52:37

回答

2
limit(y) = 2 * 1.08^(y-1) 
limit(y) > x >= limit(y - 1) 

現在,如果我沒有弄錯,

2 * 1.08^(y - 1) > x >= 2 * 1.08^(y - 2) 
1.08^(y - 1) > x/2 >= 1.08^(y - 2) 
y - 1 > log[1.08](x/2) >= y - 2 
y + 1 > 2 + ln(x/2)/ln(1.08) >= y 

y <= 2 + ln(x/2)/ln(1.08) < y + 1 

,讓你

y = floor(2 + ln(x/2)/ln(1.08)) 
+0

該代碼肯定會比50 ifs好,但該算法也必須是有效的。任何想法如何將1xln + 2xdiv + floor + sum與erlang中最多49個ifs進行比較? – Daniel 2012-03-05 12:56:25

+0

只有一種方法可以找出,衡量。但我猜想它更有效率。 – rvirding 2012-03-05 13:08:21

+0

感謝您的方法,但ifs仍然快得多 – Daniel 2012-03-05 15:22:56