经典java笔试题:求斐波那契第30位

艾迪泰科笔试思考(2019/01/28)

今天参加艾迪泰科的笔试题时,看到一道编程题
在这里插入图片描述
很直接的写下了以下的代码:

public class Factorial{
   public static int factorial(int n){
	   if(n==0||n==1){
		   return 1;
	   }else{
		   return factorial(n-1)+factorial(n-2);
	   }
   }
   public static void main(String[] args){
   	   int V=factorial(30);
   	   System.out.println(V);
   }
}

写下来的过程中顿感有些不对劲,题目中的“第30位”是从第0位开始数,还是第1位开始数。
我假设n=2,正常从第一位开始数的话应该是1.
心中默默运行程序得到的结果是factorial(2-1)+factorial(2-2)==factorial(0)+factorial(1)=2.

结果很明显是不对。看来自己对斐波那契的理解还不是够深。
想了一会,改成这样的形式。

 if(n==1||n==2){
		   return 1;

所以做题的时候,一定要看清楚斐波那契是
0,1,1,2,3,5,8,13,21…

还是
1,1,2,3,5,8,13,21…这种形式

0,1,1,2,3,5,8,13,21…的程序写法如下:

   public static int factorial(int n){
	   if(n==1){
		   return 0;
	   }
	   else if(n==2){
           return 1;
       }else{
		   return factorial(n-1)+factorial(n-2);
	   }
   }

东方国信笔试思考(2019/01/15)

求斐波那契的非递归程序:
笔试的时候由于之前接触过这道题的思路,因此很容易就写出来了。

public static int factorial(int n){
	    int f0=1;
	    int f1=1;
    	int i=2;
	    int fn=0;
	    if(n==1||n==2){
	    	return 1;
	    }
    	while(i<=n){
    		fn=f0+f1;
    		f0=f1;
    		f1=fn;
    		i++;
    	}
    	return fn;
    }
    public static void main(String[] args){
    	int V=factorial(8);
    	System.out.println(V);
    }
}

经过今天艾迪泰科笔试,我发觉当初的写法也有些毛病。所以我的i值初始化不应该是2,应该是3,这样才能得到预期的结果。

为了保证程序的健壮性,这里应该要添加一个if条件:

   if(n==1||n==2){
       return 1;
    }

非递归写法还有另外一种:数组(已分配空间,获得数据)

public static int feibonaci2(int n){
        int arr[] = new int[n+1];
        arr[1]=1;
        arr[2]=1;
        for(int i=3;i<=n;i++){
            arr[i] = arr[i-1]+arr[i-2];
        }
        return arr[n];
    }

你可能感兴趣的:(笔试题)