Fast Fibonacci recursion

前端 未结 9 1665

I\'m trying to recall an algorithm on Fibonacci recursion. The following:

public int fibonacci(int n)  {
  if(n == 0)
    return 0;
  else if(n == 1)
    ret         


        
相关标签:
9条回答
  • 2020-12-07 23:50

    maybe like this:

    int fib(int term, int val = 1, int prev = 0)
    {
     if(term == 0) return prev;
     return fib(term - 1, val+prev, val);
    }
    

    this function is tail recursive. this means it could be optimized and executed very efficiently. In fact, it gets optimized into a simple loop..

    0 讨论(0)
  • 2020-12-07 23:51

    A good algorithm for fast fibonacci calculations is (in python):

    def fib2(n):
        # return (fib(n), fib(n-1))
        if n ==  0: return (0,  1)
        if n == -1: return (1, -1)
        k, r = divmod(n, 2) # n=2k+r
        u_k, u_km1 = fib2(k)
        u_k_s, u_km1_s = u_k**2, u_km1**2  # Can be improved by parallel calls
        u_2kp1 = 4 * u_k_s - u_km1_s + (-2 if k%2 else 2)
        u_2km1 = u_k_s + u_km1_s
        u_2k   = u_2kp1 - u_2km1
        return (u_2kp1, u_2k) if r else (u_2k, u_2km1)
    
    def fib(n):
        k, r = divmod(n, 2) # n=2k+r
        u_k, u_km1 = fib2(k)
        return (2*u_k+u_km1)*(2*u_k-u_km1)+(-2 if k%2 else 2) if r else u_k*(u_k+2*u_km1)
    

    If you need very fast computation, links to the libgmp and use mpz_fib_ui() or mpz_fib2_ui() functions.

    0 讨论(0)
  • 2020-12-07 23:53

    You can do a pretty fast version of recursive Fibonacci by using memoization (meaning: storing previous results to avoid recalculating them). for example, here's a proof of concept in Python, where a dictionary is used for saving previous results:

    results = { 0:0, 1:1 }
    
    def memofib(n):
        if n not in results:
            results[n] = memofib(n-1) + memofib(n-2)
        return results[n]
    

    It returns quickly for input values that would normally block the "normal" recursive version. Just bear in mind that an int data type won't be enough for holding large results, and using arbitrary precision integers is recommended.

    A different option altogether - rewriting this iterative version ...

    def iterfib(n):
        a, b = 0, 1
        for i in xrange(n):
            a, b = b, a + b
        return a
    

    ... as a tail-recursive function, called loop in my code:

    def tailfib(n):
        return loop(n, 0, 1)
    
    def loop(i, a, b):
        if i == 0:
            return a
        return loop(i-1, b, a+b)
    
    0 讨论(0)
  • 2020-12-07 23:54

    Say you want to have the the n'th fib number then build an array containing the preceeding numbers

    int a[n];
    a[0] = 0;
    a[1] =1;
    a[i] = n[i-1]+n[n-2];
    
    0 讨论(0)
  • 2020-12-07 23:54

    duedl0r's algorithm translated to Swift:

    func fib(n: Int, previous: (Int, Int) = (0,1)) -> Int {
        guard n > 0 else { return 0 }
        if n == 1 { return previous.1 }
        return fib(n - 1, previous: (previous.1, previous.0 + previous.1))
    }
    

    worked example:

    fib(4)
    = fib(4, (0,1) )
    = fib(3, (1,1) )
    = fib(2, (1,2) )
    = fib(1, (2,3) )
    = 3
    
    0 讨论(0)
  • 2020-12-07 23:56

    You need to memorize the calculated value in order to stop exponential growth.

    1. Just use an array to store the value.
    2. Check the array if you have already calculate it.
    3. If it finds it,use it or otherwise calculate it and store it.

    Here is an working example for faster recursion using memory.

    Calculating fibonacci number

    0 讨论(0)
提交回复
热议问题