我知道如何在没有递归的情况下解决这个问题,但有了它,我有一些难以理解......我需要逐行解释它是如何逐行工作的
以下是问题的解决方法:
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)
答案 0 :(得分:5)
在Fibonacci序列中,前两个序列之后的序列中的每个数字都是前两个数字的总和:
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)
。
答案 1 :(得分: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 :(得分:0)
首先,很好理解从根本上说迭代和递归之间没有区别,并且可以使用迭代方法解决的问题可以递归地解决,反之亦然。
对于此特定示例,请查看此图。它显示了一步一步的进展:http://natashatherobot.com/wp-content/uploads/fibonacci.png
这篇文章对于阅读:http://natashatherobot.com/recursion-factorials-fibonacci-ruby/
非常有用