function fnum = fib(n)
if (n == 1) || (n == 2)
fnum = 1;
else
fnum = fib(n-1) + fib(n-2);
end
您能解释给定输入的每个步骤如何输出吗?例如输入7给我13,给5我5,但我不能跟踪如何。我将非常感谢您的回复。这种递归是如何工作的?你能解释他们是如何得到输出的吗?
function fnum = fib(n)
if (n == 1) || (n == 2)
fnum = 1;
else
fnum = fib(n-1) + fib(n-2);
end
您能解释给定输入的每个步骤如何输出吗?例如输入7给我13,给5我5,但我不能跟踪如何。我将非常感谢您的回复。这种递归是如何工作的?你能解释他们是如何得到输出的吗?
你知道斐波那契数列是如何定义的吗?这个函数递归地实现它。
再回应
斐波纳契数列定义为
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),...
好吧,让我们说如果我输入7其他人会产生fnum =(7-1)+(7-2)对不对?如果你不介意,你能解释一下这些步骤吗? – JaZZyCooL
@JaZZyCooL更新了n(5) –
的Fibonnacci系列被定义为f(1) = 1, f(2) = 1 and for all n > 2, f(n) = f(n-1) + f(n-2)
因此,当您拨打fib(1)
时,它会返回1
与fib(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.
递归基本上意味着该函数自己调用。
如果我们按照您的功能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)
。见前一段。
这是一种非常有用的编程方式,因为它是一个非常简单的函数,用于计算可能更复杂的事情。最重要的是你要确保任何递归函数都具有强大的停止标准,否则它可以永远消失!
还应该提到递归比其他方法慢,所以当速度很重要时,值得寻找其他方法。[例如在这种情况下](http://www.matrixlab-examples.com/fibonacci-numbers.html) – EBH
确实,很好的评论;) –
不一定,智能编写的代码+智能编译器通常意味着尾部调用优化。 –
看到[这里](https://www.youtube.com/watch?v=fPO8R79uV7A) – EBH
尝试使用MATLAB调试程序来了解程序如何工作 – m7913d