今天参加艾迪泰科的笔试题时,看到一道编程题
很直接的写下了以下的代码:
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);
}
}
求斐波那契的非递归程序:
笔试的时候由于之前接触过这道题的思路,因此很容易就写出来了。
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];
}