【问题标题】:Fibonacci above 100000 [duplicate]斐波那契高于 100000 [重复]
【发布时间】:2016-03-07 06:12:13
【问题描述】:

我搜索了很多斐波那契程序的示例。他们都不计算大数。我的程序计算斐波那契(10000)。我的任务是斐波那契(100000)和斐波那契(200000)。你有什么想法,也许它可以是线程?

    import java.math.*;
    import java.io.*;
    public class FastFibonacci
    {
    private static BigInteger[] answers; 

        private static BigInteger one;
    private static BigInteger zero;

    private static BufferedReader stdin = new BufferedReader( new InputStreamReader( System.in ) );

    public static BigInteger fastFibonacci(int n)
    {
        if((n == 1) || (n == 2))
                        return answers[0];

                if(answers[n-1].compareTo(zero) != 0)
                        return answers[n-1];

        if(answers[n-2].compareTo(zero) == 0)
                    answers[n-2] = fastFibonacci(n-1);

        if(answers[n-3].compareTo(zero) == 0)
                    answers[n-3] = fastFibonacci(n-2);

                return answers[n-2].add(answers[n-3]);
    }

        public static void main(String[] args)
        {

                int n;
        long time, newTime;
        BigInteger answer;

                System.out.println("Type a positive integer." );
                try{
                       String input = stdin.readLine();
                        n = Integer.parseInt( input );

            zero = new BigInteger("0");
            one = new BigInteger("1");

            answers = new BigInteger[n];
            answers[0] = new BigInteger("1");
            answers[1] = new BigInteger("1");
            for(int i = 2; i < n; i++)
                answers[i] = new BigInteger("0");

                        time = System.currentTimeMillis();
                        answer = fastFibonacci(n);
                        newTime = System.currentTimeMillis();

                        System.out.println("The "+n+"th Fibonacci number is "+ answer);
                        System.out.println("It took " + (newTime-time) + " milliseconds to compute it.");

                }
                catch(java.io.IOException e)
                {
                        System.out.println(e);
                }



    }

}

感谢所有回答。

【问题讨论】:

  • 你有什么问题?
  • 是什么阻止你用更大的数字调用这个函数?真正的问题是什么?
  • 当放置 100000 时,线程“main”java.lang.StackOverflowError 出现错误异常
  • 您确定在递归调用 fastFibonacci 时达到了基本情况吗?
  • 每当我看到一个名为 fastSomething() 的函数/方法时,我都会不寒而栗 :p 但无论如何,在你的情况下,看起来你想要记忆......或者从斐波那契套件计算结果的更好方法

标签: java multithreading biginteger fibonacci


【解决方案1】:

有这么多递归调用,调用堆栈会溢出(更不用说它会非常慢)。改用迭代算法,例如:

private BigInteger fib(int n) {
    BigInteger prev = BigInteger.ONE;
    BigInteger prevprev = BigInteger.ONE;
    BigInteger num = BigInteger.ONE;
    for (int i = 2; i < n; ++i) {
        num = prev.add(prevprev);
        prevprev = prev;
        prev = num;
    }
    return num;
}

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多