打印第N个斐波纳契数的代码

时间:2017-06-24 13:01:17

标签: java fibonacci

所以这是我的assignemt,我必须编写一个接受小于100的数字的函数并返回该位置的fibonacci元素。我不明白我的代码有什么问题。请注意,我只写了getFibonacciElementAt功能代码

import java.util.Scanner; 
public class FibonacciNumber {


    public long getFibonacciElementAt(int index) {

        Scanner sc= new Scanner(System.in);
        System.out.println("Please enter the number");
        int n= sc.nextInt();
    if(n<0)

        return -1;

        int a=0;
        int b=1;
        int i;
        for(i=2; i<=n; i++)
        {
            int temp=a;
            a=b;
            b=temp;
        }
        return a;
    }

    public void printFibonacciElementAt(int index) {
        System.out.println(getFibonacciElementAt(index));
    }

    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("Exactly 1 inputs required.");
            return;
        }

        try {
            int num = Integer.parseInt(args[0]);
            FibonacciNumber obj = new FibonacciNumber();

            obj.printFibonacciElementAt(num);
        } catch (NumberFormatException e) {
            System.out.println("Only integers allowed.");
        }
    }
}

2 个答案:

答案 0 :(得分:1)

好的,所以使用memoization重新发布一个更好的递归版本,因此n&lt; = 100的运行时间不到1秒:

public static long getFibonacciElementAt(int n, long[] d) {
    if (n == 0 || n == 1)
        return n;

    if (d[n] == 0)
        d[n] = getFibonacciElementAt(n - 1, d) + getFibonacciElementAt(n - 2, d);

    return d[n];

}

但是一旦调用该方法,只需传递一个大小为n + 1的新数组,如下所示:

System.out.println(getFibonacciElementAt(n, new long[n+1]));

答案 1 :(得分:0)

您只是在交换,而不是添加前两个数字。所以请尝试以下方法:

int a=0;
int b=1;
int temp;
for(int i=2; i<=n; i++)
{
    temp=a+b;
    a=b;
    b=temp;
}
return b;