递归函数生成/打印斐波纳契数列

时间:2014-03-06 10:41:54

标签: matlab recursion

我正在尝试创建一个递归函数调用方法,将斐波那契打印到特定位置:

1 function f = fibonacci(n)
2 fprintf('The value is %d\n', n)
3 if (n==1)
4     f(1) = 1;
5     return;
6 elseif (n == 2)
7     f(2) = 2;
8 else
9     f(n) = fibonacci(n-1) + fibonacci(n-2);   
10 end
11 end

根据我的理解,fibonacci函数将被递归调用,直到传递给它的参数n的值为1.然后函数堆栈将相应地回滚。所以当我从命令中调用这个函数时:

>> fibonacci(4)

n的值为4,因此第9行的执行方式如下:

9 f(4) = fibonacci(3) + fibonacci(2);

现在我相信第一个斐波那契(3)会被称为 - 因此斐波那契(3)

9 if(3) = fibonacci(2) + fibonacci(1);

第3和第6行的ifs会照顾。

但现在斐波那契(2)+斐波那契(1)的陈述将如何变为:

 if(3) = 2 + 1;

我收到以下错误,无法进一步调试解决问题:

>> fibonacci(4)
The value is 4
The value is 3
The value is 2
The value is 1
In an assignment  A(I) = B, the number of elements in B and I must be the same.

Error in fibonacci (line 9)
    f(n) = fibonacci(n-1) + fibonacci(n-2);

Error in fibonacci (line 9)
    f(n) = fibonacci(n-1) + fibonacci(n-2);

请提供一些有关解决方案的见解,以及首先在第9行以递归方式调用fibonacci函数的参数。

前言n = 4

f(n) = fibonacci(3) + fibonacci(2);

MATLAB首先会调用fibonacci(3)还是斐波那契(2)?

代码不应该像下面那样:

1 function f = fibonacci(n)
2 fprintf('The valus is %d\n', n)
3 if (n==1)
4     f(1) = 1;
5     return f(1);
6 elseif (n == 2)
7     f(2) = 2;
8    return f(2);
9 else
10   f(n) = fibonacci(n-1) + fibonacci(n-2);   
11 end
12 end
  
    

斐波纳契(4)     错误:文件:fibonacci.m行:5列:12     意外的MATLAB表达式。

  

为什么在函数中返回表达式会导致错误?

4 个答案:

答案 0 :(得分:2)

试试这个:

 function f = fibonacci(n)
 if (n==1)
     f= 1;
 elseif (n == 2)
     f = 2;
 else
     f = fibonacci(n-1) + fibonacci(n-2);   
 end

请注意,这也是一个递归(只计算每个n一次):

function f=fibonacci(n)
  f=additive(n,1,2);

function a=additive(n,x0,x1)
  if(n==1)
    a=x0;
  else 
    if(n==2)
      a=x1;
    else 
      a=additive(n-1,x1,x0+x1);
    end
  end

答案 1 :(得分:1)

如果你必须使用递归方法,试试这个 -

function out = fibonacci(n)
fprintf('The valus is %d\n', n)

if (n==1)
    out = 1;
    return;
elseif (n == 2)
    out = 2;
    return;
else
    out = fibonacci(n-1) + fibonacci(n-2);
end

return;

与C / C ++不同,在带有'return'的MATLAB中,无法返回值,但只有控件返回到调用函数。要返回到调用函数的输出将存储在函数开头定义的输出变量中。

编辑1:对于整个斐波那契系列并假设该系列从1开始,请使用此 -

N = 16; %// Number of fibonacci numbers needed

all_nums = zeros(1,N);
all_nums(1) = 1;
for k = 2:N
    all_nums(k) = fibonacci(k-1);
end

给予 -

1     1     2     3     5     8    13    21    34    55    89   144   233   377   610   987

答案 2 :(得分:0)

为斐波那契函数创建一个M文件并编写如下所示的代码

function [ result ] = fibonacci( n )

if n==0|n==1
    result = n;

else
    result = fibonacci(n-2)+fibonacci(n-1);
end
end

在matlab的命令窗口中编写以下代码

for n = 0:10
    fprintf('Fibonacci(%d)= %d\n', n, fibonacci(n));
    end

输出: -

Fibonacci(0)= 0
Fibonacci(1)= 1
Fibonacci(2)= 1
Fibonacci(3)= 2
Fibonacci(4)= 3
Fibonacci(5)= 5
Fibonacci(6)= 8
Fibonacci(7)= 13
Fibonacci(8)= 21
Fibonacci(9)= 34
Fibonacci(10)= 55

答案 3 :(得分:0)

Create a function, which returns Integer:

func fibonacci(number n : Int) -> Int 
{
    guard n > 1 else {return n}
    return fibonacci(number: n-1) + fibonacci(number: n-2)
}

This will return the fibonacci output of n numbers, To print the series You can use this function like this in swift:

for _ in 0...10
{
    print(fibonacci(number : 10))
}

It will print the series of 10 numbers.