当前位置: 代码迷 >> J2SE >> 一道java原理题(一道简单的面试题,高手与低手的区别就在这里),该如何解决
  详细解决方案

一道java原理题(一道简单的面试题,高手与低手的区别就在这里),该如何解决

热度:307   发布时间:2016-04-24 01:34:22.0
一道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是全局的,所以调用或回退时值不会变化了。
------解决方案--------------------
经典的肺部尼奇啊……
  相关解决方案