Fibonacci sequence in Ruby (recursion)

后端 未结 24 1241
悲&欢浪女
悲&欢浪女 2020-12-01 02:54

I\'m trying to implement the following function, but it keeps giving me the stack level too deep (SystemStackError) error.

Any ideas what the problem mi

相关标签:
24条回答
  • 2020-12-01 03:49

    If you want to write the fastest functonal algorithem for fib, it will not be recursive. This is one of the few times were the functional way to write a solution is slower. Because the stack repeats its self if you use somethingn like

    fibonacci( n - 1 ) + fibonacci( n - 2 ) 
    

    eventually n-1 and n-2 will create the same number thus repeats will be made in the calculation. The fastest way to to this is iteratvily

    def fib(num)
    # first 5 in the sequence 0,1,1,2,3
    fib1 = 1 #3
    fib2 = 2 #4
    i = 5 #start at 5 or 4 depending on wheather you want to include 0 as the first number
    while i <= num
        temp = fib2
        fib2 = fib2 + fib1
        fib1 = temp
        i += 1
    end
    p fib2
    end
    fib(500)
    
    0 讨论(0)
  • 2020-12-01 03:50

    Try this

    def fibonacci( n )
      return  n  if ( 0..1 ).include? n
      ( fibonacci( n - 1 ) + fibonacci( n - 2 ) )
    end
    puts fibonacci( 5 )
    # => 5
    

    check this post too Fibonacci One-Liner

    and more .. https://web.archive.org/web/20120427224512/http://en.literateprograms.org/Fibonacci_numbers_(Ruby)

    You have now been bombarded with many solutions :)

    regarding problem in ur solution

    you should return n if its 0 or 1

    and add last two numbers not last and next

    New Modified version

    def fibonacci( n )
        return  n  if n <= 1 
        fibonacci( n - 1 ) + fibonacci( n - 2 )
    end 
    puts fibonacci( 10 )
    # => 55
    

    One liner

    def fibonacci(n)
       n <= 1 ? n :  fibonacci( n - 1 ) + fibonacci( n - 2 ) 
    end
    puts fibonacci( 10 )
    # => 55
    
    0 讨论(0)
  • 2020-12-01 03:50

    It's been a while, but you can write a fairly elegant and simple one line function:

    def fib(n)
      n > 1 ? fib(n-1) + fib(n-2) : n
    end
    
    0 讨论(0)
  • 2020-12-01 03:51

    Another approach of calculating fibonacci numbers taking the advantage of memoization:

    $FIB_ARRAY = [0,1]
    def fib(n)
      return n if $FIB_ARRAY.include? n
      ($FIB_ARRAY[n-1] ||= fib(n-1)) + ($FIB_ARRAY[n-2] ||= fib(n-2))
    end
    

    This ensures that each fibonacci number is being calculated only once reducing the number of calls to fib method greatly.

    0 讨论(0)
  • 2020-12-01 03:51

    1) Example, where max element < 100

    def fibonachi_to(max_value)
      fib = [0, 1]
      loop do
        value = fib[-1] + fib[-2]
        break if value >= max_value
        fib << value
      end
      fib
    end
    
    puts fibonachi_to(100)
    

    Output:

    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    

    2) Example, where 10 elements

    def fibonachi_of(numbers)
      fib = [0, 1]
      (2..numbers-1).each { fib << fib[-1] + fib[-2] }
      fib
    end
    
    puts fibonachi_of(10)
    

    Output:

    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    
    0 讨论(0)
  • 2020-12-01 03:53

    Here is one in Scala:

    object Fib {
      def fib(n: Int) {
        var a = 1: Int
        var b = 0: Int
        var i = 0: Int
        var f = 0: Int
        while(i < n) {
          println(s"f(${i+1}) -> $f")
          f = a+b
          a = b
          b = f
          i += 1
        }
      }
    
      def main(args: Array[String]) {
        fib(10)
      }
    }
    
    0 讨论(0)
提交回复
热议问题