2017-08-01 104 views
-1
function fnum = fib(n) 
if (n == 1) || (n == 2) 
    fnum = 1; 
else 
    fnum = fib(n-1) + fib(n-2); 
end 

您能解释给定输入的每个步骤如何输出吗?例如输入7给我13,给5我5,但我不能跟踪如何。我将非常感谢您的回复。这种递归是如何工作的?你能解释他们是如何得到输出的吗?

+0

看到[这里](https://www.youtube.com/watch?v=fPO8R79uV7A) – EBH

+0

尝试使用MATLAB调试程序来了解程序如何工作 – m7913d

回答

1

你知道斐波那契数列是如何定义的吗?这个函数递归地实现它。

再回应

斐波纳契数列定义为

n(1) = 1 
n(2) = 1 
n(k+1) = n(k) + n(k-1) 

所以,当你把5作为参数,扩展成为

n(4+1) = n(4)+n(3) 
     = n(3)+n(2)+n(2)+n(1) 
     = n(2)+n(1)+1+1+1 
     = 1+1+1+1+1 
     = 5 

一个信封法容易得多背从第一个索引开始,并添加最后两个条件到达下一个索引。

1,1,2 < - (1 + 1),3 < - (2 + 1),5 < - (3 + 2),...

+0

好吧,让我们说如果我输入7其他人会产生fnum =(7-1)+(7-2)对不对?如果你不介意,你能解释一下这些步骤吗? – JaZZyCooL

+0

@JaZZyCooL更新了n(5) –

1

的Fibonnacci系列被定义为f(1) = 1, f(2) = 1 and for all n > 2, f(n) = f(n-1) + f(n-2)

因此,当您拨打fib(1)时,它会返回1fib(2)相同。但是当您拨打fib(3)时,它将返回fib(3-1) + fib(3-2),即fib(2) + fib(1) = 2。然后当您拨打fib(4)时,它会返回fib(3) + fib(2) = (fib(2) + fib(1)) + fib(1) = 3。递归斐波那契数列等于1, 1, 3, 5, 8, 13, 21, ...

对于n不同于1或2的代码,它递归地调用函数fib。当等于1或2时,它返回1.

2

递归基本上意味着该函数自己调用。

如果我们按照您的功能fib(3),你会看到它所做的是叫fib(2)+fib(1)。这些值被定义,并且是1,因此它将返回2.

如果用fib(4)调用它,它将运行并计算fib(3)+fib(2)。你已经知道fib(3)是做什么的(见前段),我们已经提到fib(2)返回1

如果你用fib(5)调用它,它会去计算fib(4)+fib(3)。见前一段。

这是一种非常有用的编程方式,因为它是一个非常简单的函数,用于计算可能更复杂的事情。最重要的是你要确保任何递归函数都具有强大的停止标准,否则它可以永远消失!

+1

还应该提到递归比其他方法慢,所以当速度很重要时,值得寻找其他方法。[例如在这种情况下](http://www.matrixlab-examples.com/fibonacci-numbers.html) – EBH

+0

确实,很好的评论;) –

+0

不一定,智能编写的代码+智能编译器通常意味着尾部调用优化。 –

相关问题