有道面试题,很简单 ,
1、一组有规则的数1、1、2、3、5、8、13、21、34……,问:第30位的数是多少
请有递归算法写出来。
下面分别是我的C,和java 的代码。用C一点问题也没有,但用java就有问题了。当30的时候,它一直
偱环多了几十次。不知有那位高手来帮帮我解释一下。//这是我的C代码#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代码
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);
}
}

解决方案 »

  1.   

    我也搞神经了,都不知java的运行原理。怎么搞的。哎。有高手知道的出来发发意见啦。
      

  2.   

    fibonacci对列 return conut(conut(j));为什么要嵌套调用?
      

  3.   


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

  4.   

    return count(count(j));应改为return count(j);
    不然每次递归时就会产生两次调用。K=30时,回退了两次,由于K是全局的,所以调用或回退时值不会变化了。
      

  5.   


    public class FindNumTest {
    /**
     * 有道面试题,很简单 , 
     * 1、一组有规则的数1、1、2、3、5、8、13、21、34……,问:第30位的数是多少 
     * 请有递归算法写出来。
     */
    public static void main(String[] args) {
            long x=getNum(30);
            System.out.println(x);
    }

    public static long getNum(long index){
    if(index<2){
    return 1;
    }
    return getNum(index-1)+getNum(index-2);
    }
    }
    楼主的题这样解是不是更直观呢??
      

  6.   


    getNum()里面的index应该 是<=2,大意了
      

  7.   

    楼主的代码写的太繁琐了,基本上一个循环加if语句return就差不多了,去看看例子程序吧,一般都是9楼这种写法!