面试题目要求计算Fibonacci数列,使用c++语言编写程序:1,1,2,3,5,8,13,...
也参加过几个面试,都没有出过什么题目,题目来的太突然,我就发蒙了,结果就写错了,还使用了一个递归函数。这都是学习scheme带来的后遗症,总觉得有递归才高级;而且还有学习python带来的后遗症,两个记忆搞在一处,总觉得python中用了一个简单的递归函数就解决了这个问题。今天一翻python tutorial才发现根本不是用的递归。
为了一血前耻,我决定“亲自”写一写这个程序:
// for循环版本 int fibo(int n) { int a = 0, b = 1; int next; for(int i = 1; i < n; i++) { next = a + b; a = b; b = next; } return b; }
// 递归版本;有太多重复计算(每次迭代中都调用两次fibo,这样进行了不必要的重复计算) int fibo(int n) { if (n==1 || n==2) return 1; else return fibo(n-1) + fibo(n-2); }
// 递归版本,没有过多重复计算(经测试正确) int fibo(int n) { int a, b; fib(n, a, b); return b; } void fib(int n, int& a, int& b) { if (n == 2) { a = 1; b = 1; } else{ int a_former, b_former; fib(n-1, a_former, b_former); b = a_former + b_former; a = b_former; } }
教训:不要限制自己的思维,尤其是在学习了某个东西之后,要尽快忘掉它。老想生搬硬套过去的、模糊的经验,反而会限制自己,甚至走上歧途。真真就是张三丰学太极啊!忘了所学的,从最基本的逻辑出发,就能得到对的结果。
关键词:少用套路!!