啊送分题(想起有次做某厂测试的笔试,大家都是这种题,而我是一个字符串重复匹配???)
这题递归做很简单,几行代码完事。
lambda的性能不如直接写,超时了。
UnaryOperator<Integer> ff;
public int Fibonacci(int n){
ff = i->i<=1?i:(ff.apply(i-1)+ff.apply(i-2));
return ff.apply(n);
}
但是它的效率并不高,可以画下它的流程结构,会发现是一个类似二叉树的结构,而且在重复计算极多。
那么这种有重复计数且无后效性的,肯定想到动态规划啊(用备忘录深搜也行),递推型的动态规划。
不过这题及其简单就是了。
备忘录:
import java.util.function.UnaryOperator;
import java.util.Arrays;
public class Solution {
UnaryOperator<Integer> ff;
volatile int[] ans;
public int Fibonacci(int n){
if(n<=1)return n;
ans = new int[n+1];
Arrays.fill(ans,-1);
ans[0] = 0;
ans[1] = 1;
ff = i-> {
if(ans[i]!=-1)
return ans[i];
ans[i] =ff.apply(i-1)+ff.apply(i-2);
return ans[i];
};
return ff.apply(n);
}
}
递推:
public int Fibonacci(int n){
int pre_1 = 0,pre_2 =1,curr =n;
for(int i=2;i<n+1;i++){
curr = pre_1+pre_2;
pre_1 = pre_2;
pre_2 = curr;
}
return curr;
}