在没有先前数字的情况下递归求解Fibonacci序列

时间:2014-02-16 08:53:36

标签: java recursion fibonacci

有没有办法将Fibonacci序列打印到第n位,而不需要任何信息?这是我的一种方法,尽管我们使用的是先验信息。

int p;
int n = 0;
String fib = "0, 1";

public printFib () {
    String fibSequence = fibPrint(0, 1, x); //x denotes xth fib number
    System.out.println(fibSequence);
}

private String logicFib (int a, int b, int c) {
    if (n == c-2) {
        return fib;
    } else {
        n++;
        p = a + b;
        fib = fib + ", " + p;
        logicFib(b, p, c);
    }
}

这里的问题是我在数字3, 4, 5, ... n之上打印数字1, 2,当我想要打印它们而不先声明前两位数字。我的方法的逻辑仅在前两位数已知时才有效,当我想放弃时。

3 个答案:

答案 0 :(得分:1)

嗯,你知道限制,因为你必须知道你想要打印多少个数字。

public class Fibonacci {
    public int limit = 10;
    public int left=0, right=1;
    public int next;
    public void countNextFibo(int limit) {
        if(this.limit==0) {
            return;
        }
        else {
            System.out.print(left+", ");
            next = left+right;
            left = right;
            right = next;            
            --this.limit;
            countNextFibo(this.limit);
        }
    }

    public static void main(String args[]) {
        Fibonacci f = new Fibonacci();
        f.countNextFibo(10);
    }
}

答案 1 :(得分:1)

我认为Fibonacci的标准解决方案如下所示:

public class Fibonacci {

    public long fibo(long n){   
        if(n == 0)
            return 0;
        if(n == 1)
            return 1;
        else
            return fibo(n-1) + fibo(n-2);
    }

    public static void main(String...args){

        int n = 20;
        Fibonacci f = new Fibonacci();
        for(int i = 0; i < n; i++){
            System.out.println(f.fibo(i));
        }
    }
}

在递归方法中,您总是需要休息条件。在这种斐波纳契方法的情况下,这将是您可以在上面识别的第0和第1个斐波那契数。没有其他方法可以递归地计算斐波那契数。你只需要休息条件。

如果您不需要方法的递归字符,可以通过Binet的公式计算数字。有关此内容的更多信息,请单击here

修改

我改变了我的方法。它现在正在计算直到第n个斐波纳契数。

答案 2 :(得分:1)

此解决方案使用Iterator接口。运行时,它会计算长距离内的所有斐波纳契数。接受的答案是双倍指数时间,因为每次调用都是O(n^2)。在我的计算机上将n更改为93以与我的程序相同,它将使用几个小时来计算此代码在0.09秒内执行的相同列表。

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.lang.IllegalArgumentException;

public class Fibonacci implements Iterable<Long>
{
    final int FIB_MAX_LONG_INDEX = 92; // highest index producing correct long 
    int fromIndex = 0;
    int toIndex = FIB_MAX_LONG_INDEX;

    public Fibonacci(int fromIndex, int toIndex)
    {
        if( fromIndex > toIndex )
            throw new IllegalArgumentException("toIndex must be same or greater than fromIndex");

        if( toIndex > FIB_MAX_LONG_INDEX )
            throw new IllegalArgumentException("toIndex must be lowe or equal to 92 to not overflow long");

        this.fromIndex = fromIndex;
        this.toIndex = toIndex;
    }

    public Fibonacci(){}

    private class FibonacciIterator implements Iterator<Long>
    {
        private long cur = 0, next = 1;
        private int index=0;

        public boolean hasNext()
        {
            return index <= toIndex;
        }

        public Long next()
        {
            if ( index > toIndex )
                throw new NoSuchElementException();

            long tmpCur;
            do {
                tmpCur = cur;
                cur = next;
                next +=tmpCur;
                index++;
            } while ( index <= fromIndex );

            return tmpCur;
        }

        public void remove()
        {
            throw new UnsupportedOperationException();
        }
    }

    public Iterator<Long> iterator()
    {
        return new FibonacciIterator();
    }

    public static void main (String[] args)
    {
        Fibonacci fib = new Fibonacci();
        for (long i : fib)
        {
            System.out.print( i + " ");
        }
        System.out.println();
    }
}

运行时的输出(我添加了一些换行符):

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
2584 4181 6765 10946 17711 28657 46368 75025 121393
196418 317811 514229 832040 1346269 2178309 3524578
5702887 9227465 14930352 24157817 39088169 63245986
102334155 165580141 267914296 433494437 701408733
1134903170 1836311903 2971215073 4807526976 7778742049
12586269025 20365011074 32951280099 53316291173 
86267571272 139583862445 225851433717 365435296162 
591286729879 956722026041 1548008755920 2504730781961
4052739537881 6557470319842 10610209857723 
17167680177565 27777890035288 44945570212853 
72723460248141 117669030460994 190392490709135 
308061521170129 498454011879264 806515533049393 
1304969544928657 2111485077978050 3416454622906707 
5527939700884757 8944394323791464 14472334024676221 
23416728348467685 37889062373143906 61305790721611591
99194853094755497 160500643816367088 
259695496911122585 420196140727489673 
679891637638612258 1100087778366101931 
1779979416004714189 2880067194370816120 
4660046610375530309 7540113804746346429 

但正如您所见,您可以制作任何指数范围。以下循环超过30到39并最终打印832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986

Fibonacci fib = new Fibonacci(30, 39);
for( long i : fib) {
    System.out.print(i + " "); 
}