如何使用递归获得fibonacci序列?

时间:2015-03-27 20:00:03

标签: matlab recursion fibonacci

我试图使用递归找到fib序列,但我的函数一直给我一个错误。

function y = r_nFib(seq, n)
y = zeros(1,n);
for m = 1:n
    y(m) = r_nFib(m);
end
if seq == 0
    y = [0 y];
else
    y = [seq, seq, y];
function y = r_nFib(seq, n)
if n<3
   y(1:n) = 1;
else
    y(n) = r_nFib(n-2) + r_nFib(n-1);
end
    y = y(n);
end
end

n是fib序列的长度,seq是起始编号。如果seq为0,那么序列将如何开始

y = [0 1 1 2 3 5 8] % first two number will be the 0 and 1

如果seq是0以外的任何东西,那么

如果seq = 2;

y = [2 2 4 6 10] % first two number will be the seq

如何更正我的功能以给我正确的答案。我从未使用过递归,而且我是新手。任何帮助都会非常感激。

y = r_nFib(4,10)
y = [4 4 8 12 20 32 52 84 136 220];

谢谢。

2 个答案:

答案 0 :(得分:1)

这是我为matlab输入的解决方案,解释了递归:


递归方法的工作方法是,每次调用方法时,将较大的问题分解为较小的问题这可以让您打破困难的问题;一个因子总和,成为一系列较小的问题。

每个递归函数有两部分:
1)基本情况:我们关心评估的最低值。通常这会变为零或一。

if (num == 1)
  out = 1;
end


2)一般情况:一般情况是在我们达到基本情况之前我们要打电话的情况。我们再次调用该函数,但这次比前一个函数少了1个。这使我们能够走向基本案例。

out = num + factorial(num-1);

这句话意味着我们将首先调用该函数,其中的函数比函数少1;我们从三开始,下一个调用以两个开始,之后的调用以1开始(这触发了我们的基本情况!)

一旦达到基本情况,方法&#34; recurse-out&#34; 。这意味着它们向后反弹,返回到调用它的函数中,从它下面的函数中获取所有数据!
此时我们的求和实际上已经发生了。

一旦达到原始功能,我们就会得到最终的总和。

例如,让我们说你想要前3个整数的总和。 第一个递归调用传递给数字3。

  function [out] = factorial(num)
     %//Base case
     if (num == 1)
        out = 1;
     end
  %//General case
  out = num + factorial(num-1);

遍历函数调用:

factorial(3); //Initial function call

//Becomes..
factorial(1) + factorial(2) + factorial(3) = returned value

这给了我们6的结果!


matlab - Clearer explanation of recursion

答案 1 :(得分:1)

function y = r_nFib(seq, n)

if length(seq) == 1
    if seq == 0
        seq = [0, 1];
    else
        seq = [seq, seq];
    end
end

if length(seq) >= n
    y = seq;
else
    y = r_nFib([seq (seq(end - 1) + seq(end))], n);
end