记录一次失败的面试

面试题目要求计算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;
    }
}

教训:不要限制自己的思维,尤其是在学习了某个东西之后,要尽快忘掉它。老想生搬硬套过去的、模糊的经验,反而会限制自己,甚至走上歧途。真真就是张三丰学太极啊!忘了所学的,从最基本的逻辑出发,就能得到对的结果。

关键词:少用套路!!     

猜你喜欢

转载自blog.csdn.net/laowulong350/article/details/79915216