【问题标题】:fibonacci recursion ruby explanation [closed]斐波那契递归红宝石解释
【发布时间】:2014-09-25 21:23:16
【问题描述】:

我知道如何在没有递归的情况下解决这个问题,但是有了它,我很难理解......我需要逐行深入解释它是如何工作的

问题是这样解决的:

def fibo(num)
  if num < 2
    num
  else
    #this is where I get lost on the line below..
    fibo(num-1) + fibo(num-2)
  end
end

p fibo(6)

【问题讨论】:

    标签: ruby algorithm recursion fibonacci


    【解决方案1】:

    如果您了解堆栈帧,您可以更好地理解递归。让我们用一个更简单的 x = Fib(3) 来显示堆栈帧的变化。

    (1) 调用Fib(3)时,Fib函数的栈是这样的,参数为3: | | | 3 |

    (2) 当 Fib(3) 走到 Fib(n-1) + Fib(n-2) 行时,栈是这样的: | | | 2 | | 3 |

    (3) 那么这个Fib(2)被计算为Fib(1)+Fib(0),栈是这样的: | 1 | | 2 | | 3 |

    (4) fib(1) 返回值 1,现在轮到 fib(0) 进行计算: | 0 | | 2 | | 3 |

    (5) Fib(0) 返回 0,现在 Fib(2) 的值为 1 并返回给 Fib(3),| 1 | 现在 Fib(3) 需要另一个部分,Fib(1),堆栈是这样的: | 3 |

    (6) Fib(1) 返回 1,现在 Fib(3) 被评估为 2,并返回,堆栈为空。

    编辑:为什么 StackOverflow 不保留格式? 或者,请参考此链接:http://en.wikipedia.org/wiki/Recursion_(computer_science)

    或这个 youtube 视频:https://www.youtube.com/watch?v=k0bb7UYy0pY

    【讨论】:

      【解决方案2】:

      在斐波那契数列中,序列中前2个数之后的每个数都是前2个数的和:

      0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
      

      当您编写递归函数时,您明确处理基本情况(在您的情况下为fibo(0)fibo(1)),然后通过调用您正在编写的函数计算其他任何内容,通过以下方式构建以后的结果对早期的进行操作。

      根据定义,在序列中的前 2 个数字之后,斐波那契数是前 2 个数字的总和。换句话说,fibo(n) = fibo(n-1) + fibo(n-2)。这就是这行代码的作用:

      fibo(num-1) + fibo(num-2)
      

      它通过调用前两个数字自身(即“递归”)并将它们相加来返回 fibo(num) 的值。

      因为它们是基本情况,所以我们知道 fibo(0) 将为 0,而 fibo(1) 将为 1。让我们看看 fibo(4) 是如何工作的:

      fibo(4) = fibo(3) + fibo(2)
      fibo(4) = (fibo(2) + fibo(1)) + (fibo(1) + fibo(0))
              = (fibo(2) +    1   ) + (   1    +    0   )
              = (fibo(2) + 2)
              = ((fibo(1) + fibo(0)) + 2
              =     1     +    0     + 2
              = 3
      

      因此,程序最终通过将每个计算分解为更简单的问题来计算正确的结果,直到达到已定义答案的基本情况。请注意,这不是很有效,因为 fibo 被调用 9 次来计算 fibo(4)

      【讨论】:

        【解决方案3】:

        首先,很高兴了解迭代和递归之间没有区别,可以使用迭代方法解决的问题可以递归解决,反之亦然。

        对于这个特殊的例子,看看这张图。它一步一步显示正在发生的事情:http://natashatherobot.com/wp-content/uploads/fibonacci.png

        这篇文章对阅读很有帮助:http://natashatherobot.com/recursion-factorials-fibonacci-ruby/

        【讨论】:

          猜你喜欢
          • 2019-07-24
          • 2014-08-17
          • 2016-06-27
          • 1970-01-01
          • 2014-01-16
          • 2010-12-03
          • 1970-01-01
          • 2014-04-02
          相关资源
          最近更新 更多