任何前两个数字的java斐波那契

时间:2016-09-06 02:28:15

标签: java recursion fibonacci tail-recursion

我需要编写java方法来计算用户估算的任意前两个数字的Fibonacci系列,让我们说用户输入1020,并希望第一个系列的5个数字,输出为10 20 30 50 80。我已经实现了一个迭代方法,但是我的麻烦在于用RECURSIVE方法完成它。

public int fRec(int n)
    {
        //base case of recursion
        if ((n == 0) || (n == 1))
            return n;
        else
            //recursive step
            return fRec(n-1) + fRec(n-2);
    }

这是斐波纳契系列的典型递归方法,n参数表示用户希望系列运行的数量,但我如何修改它以确保系列使用第一个用户想要系列开头的两个数字?

3 个答案:

答案 0 :(得分:3)

我会将memoizationftime()一起使用,并将Map<Integer,Long>first条款传递给构造函数。例如,

second

哪些输出(根据要求)

public class Fibonacci {
    public Fibonacci(long first, long second) {
        memo.put(0, first);
        memo.put(1, second);
    }
    Map<Integer, Long> memo = new HashMap<>();

    public long fRec(int n) {
        if (n < 0) {
            return -1;
        }
        if (memo.containsKey(n)) {
            return memo.get(n);
        }
        long r = fRec(n - 2) + fRec(n - 1);
        memo.put(n, r);
        return r;
    }

    public static void main(String[] args) {
        Fibonacci f = new Fibonacci(10, 20);
        for (int i = 0; i < 5; i++) {
            System.out.println(f.fRec(i));
        }
    }
}

答案 1 :(得分:2)

要从系列中的特定数字开始,需要返回0和1:

public int fib(int n, int start1, int start2) {
    switch (n) {
        case 0: return start1;
        case 1: return start2;
        default: return fib(n-1, start1, start2) + fib(n-2, start1, start2);
    }
}

这是一个非常费力的方法来计算系列的几个成员,因为它每次都会一直回到起点。更好的是封装在一个类中:

class Fib {
    private int previous;
    private int current;

    public Fib(int start1, int start2) {
        this.previous = start1;
        this.current = start2;
    }

    public int next() {
        int temp = previous + current;
        previous = current;
        current = successor;
        return current;
    }
}

答案 2 :(得分:0)

这是计算前两个数字的斐波那契数列的另一种方法。

公共类StackOverflow {

public static void main(String[] args) {

    int first = 10, second = 20;
    System.out.println(first);
    System.out.println(second);
    recursive(first, second, 2);
}

public static void recursive(int first, int second, int count) {
        if (count != 5){
            int temp = first+second;
            first= second;
            second = temp;
            System.out.println(second);
            recursive(first, second, ++count);
        }       
}

}