日期:2014-05-20  浏览次数:20583 次

一道java原理题(一道简单的面试题,高手与低手的区别就在这里)
有道面试题,很简单 ,
1、一组有规则的数1、1、2、3、5、8、13、21、34……,问:第30位的数是多少
请有递归算法写出来。
下面分别是我的C,和java 的代码。用C一点问题也没有,但用java就有问题了。当30的时候,它一直
偱环多了几十次。不知有那位高手来帮帮我解释一下。

//这是我的C代码
C/C++ code

#include <stdio.h>
int count(int num);
int i=0;
int j=0;
int k=0;
void main()
{
 int sum=count(1);
 printf("%d",sum);
}
int count(int num)
{
    j=i+num;
    i=num;
    if(k<30)
    {
        k++;
        return count(j);
    }
    else
    {
        return j;
    }
 
} 
 

//这是我的java代码
Java code


public class Demo
{
    long i=0;
    long j=0;
        int k=0;
    public long  conut(final long a)
    {
    
        j=i+a;
        i=a;
        System.out.println(i+" "+j+" "+k);
        if(k<30)
        {
            ++k;
         return conut(conut(j));
            
        }else
        {
                return j;
        }
    }
    public static void main(String[] arg)
    {
        Demo demo=new Demo();
            long num=demo.conut(1L);
        System.out.println(num);
    }
}




------解决方案--------------------
fibonacci对列

 return conut(conut(j));为什么要嵌套调用?
------解决方案--------------------
Java code

return conut(conut(j));   //多了个conut

------解决方案--------------------
return count(count(j));应改为return count(j);
不然每次递归时就会产生两次调用。K=30时,回退了两次,由于K是全局的,所以调用或回退时值不会变化了。
------解决方案--------------------
经典的肺部尼奇啊……