看到了一个优雅的迭代算法。
本质思想都很简单,迭代的话,每个数只与前面两个数有关。
最容易想到的递归,毙了;
然后是数组,每一个都等于前两个之和,for循环一遍,空间占用,毙了;
再然后我的算法:
public int Fibonacci(int n) {
if(n==0) return 0;
if(n==1)return 1;
int f1=1;int f2=1;
for(int i=2;i<n;i++){
if(i%2==0)f1=f1+f2;
else f2=f1+f2;
}
return n%2==0?f2:f1;
}
可以解决但是不够优雅,为了一个这个分奇偶。主要问题是想不出更好的办法来模拟两个数相加然后再这样一直迭代下去。
优雅的算法:
链接:https://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3
来源:牛客网
听说:谭浩强版有
int Fibonacci(int n) {
int f = 0, g = 1;
while(n--) {
g += f;
f = g - f;
}
return f;
}
g += f; //求和这个很容易想到
f = g - f; //这个就比较有趣了,通过再减一下把被覆盖的g还原处来。
这么看:
f=0 g=1
\ | \
g前面的和 f=原来的g
\| |
g前面的和 f=原来的g
..............
最后return的是f,这就是n的问题了。
然后是这题的变形跳台阶。每次最多一跳或两跳。
再然后是每次<=N跳的。
比较直观的想法:
N个台阶跳法可以分为:
1.先上一节,再直接到终点,这里跳法有1种(f(1));
2.先上两节,再直接到终点,这里跳法有2种(f(2));
3.先上3节,再直接到终点,有f(3)种;
....
N.直接N节,有1种。
所以总的f(N)=f(1)+f(2)+f(3)+.......+f(N-1)+1种。
f(1)和f(2)已知
化简一下,
f(N)=2^(N-1).