Ruby Fibonacci algorithm

前端 未结 5 711
北荒
北荒 2020-11-29 09:14

The following is a method I wrote to calculate a value in the Fibonacci sequence:

def fib(n)

    if n == 0
        return 0
    end
    if n == 1
        re         


        
5条回答
  •  心在旅途
    2020-11-29 09:45

    As others have pointed out, your implementation's run time grows exponentially in n. There are much cleaner implementations.

    Constructive [O(n) run time, O(1) storage]:

    def fib(n)
      raise "fib not defined for negative numbers" if n < 0
      new, old = 1, 0
      n.times {new, old = new + old, new}
      old
    end
    

    Memoized recursion [O(n) run time, O(n) storage]:

    def fib_memo(n, memo)
      memo[n] ||= fib_memo(n-1, memo) + fib_memo(n-2, memo)
    end
    
    def fib(n)
      raise "fib not defined for negative numbers" if n < 0
      fib_memo(n, [0, 1])
    end
    

    Recursive powers of a matrix multiplication using squared halving of the power for when you just gotta know really big factorials like 1_000_000.fib [O(log n) run time and storage (on stack)]:

    def matrix_fib(n)
      if n == 1
        [0,1]
      else
        f = matrix_fib(n/2)
        c = f[0] * f[0] + f[1] * f[1]
        d = f[1] * (f[1] + 2 * f[0])
        n.even? ? [c,d] : [d,c+d]
      end
    end
    
    def fib(n)
      raise "fib not defined for negative numbers" if n < 0
      n.zero? ? n : matrix_fib(n)[1]
    end
    

提交回复
热议问题