有道面试题,很简单 ,
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、一组有规则的数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);
}
}
return conut(conut(j)); //多了个conut
不然每次递归时就会产生两次调用。K=30时,回退了两次,由于K是全局的,所以调用或回退时值不会变化了。
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);
}
}
楼主的题这样解是不是更直观呢??
getNum()里面的index应该 是<=2,大意了