На мой взгляд, как рекурсивные и итеративные решения являются слабыми, если вы можете просто применить свои навыки математика и выработать формулу.
В этом случае мы имеем: f (n) = (2 ** n - (- 1) ** n)/3. Пыль, как вы его работаете.
f(0) = 0
f(1) = 1
f(n) = f(n-1) + 2 * f(n-2)
So the polynomial for this recurrence is:
r ** 2 = r + 2
If you sole that you will get the values of r as r1 =−1 and r2 =2
So the solution to the recurrence is on the form:
f(n) = c1 ∗ r1 ** n + c2 ∗ r2 ** n
To work out the values for c1 and c2 constants just use the initial condition f(0) = 0 and f(1) = 1 and you will get
c1 = -1/3 and c2 = 1/3
So the final formula for your iteration is
f(n) = (-1 * (-1) ** n + 2 ** n)/3 = (2 ** n -(-1) ** n)/3.
Как только вы знаете, что формула, реализующая ее в java или на любом другом языке, проста.
public static int f(int n) {
return n <= 1 ? n: (Math.pow(2,n) - Math.pow(-1, n))/3;
}
Надеется, что это помогло
, что вы пытались до сих пор? – nachokk
'return ((1 << n) +1)/3;' :) – ZhongYu