我试图使用递归找到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];
谢谢。
答案 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的结果!
答案 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