首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成/打印Fibonacci级数的递归函数

生成/打印Fibonacci级数的递归函数
EN

Stack Overflow用户
提问于 2014-03-06 10:41:53
回答 4查看 15.7K关注 0票数 1

我正在尝试创建一个递归函数调用方法,该方法将打印Fibonacci,直到某个特定位置:

代码语言:javascript
运行
复制
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。然后函数堆栈将相应回滚。所以当我从命令调用这个函数时:

代码语言:javascript
运行
复制
>> fibonacci(4)

N的值为4,因此第9行执行如下:

代码语言:javascript
运行
复制
9 f(4) = fibonacci(3) + fibonacci(2);

现在我相信,第一个斐波纳契(3)将被称为-因此再次对斐波纳契(3)。

代码语言:javascript
运行
复制
9 if(3) = fibonacci(2) + fibonacci(1);

第3行和第6行的ifs会注意的。

但是现在fibonacci(2) + fibonacci(1)语句将改为:

代码语言:javascript
运行
复制
 if(3) = 2 + 1;

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

代码语言:javascript
运行
复制
>> 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

代码语言:javascript
运行
复制
f(n) = fibonacci(3) + fibonacci(2);

那么MATLAB会首先调用fibonacci(3)还是fibonacci(2)呢?

代码不应该如下所示:

代码语言:javascript
运行
复制
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

fibonacci(4)错误: File: fibonacci.m Line: 5列: 12意外的MATLAB表达式。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-06 11:04:04

试试这个:

代码语言:javascript
运行
复制
 function f = fibonacci(n)
 if (n==1)
     f= 1;
 elseif (n == 2)
     f = 2;
 else
     f = fibonacci(n-1) + fibonacci(n-2);   
 end

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

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2014-03-06 11:00:41

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

代码语言:javascript
运行
复制
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++不同的是,在MATLAB中,一个人不能返回一个值,但是只有控件可以返回调用函数。要返回到调用函数的输出将存储在函数开始时定义的输出变量中。

编辑1:用于整个斐波纳契系列,并假定该系列从1开始,请使用-

代码语言:javascript
运行
复制
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

给予-

代码语言:javascript
运行
复制
1     1     2     3     5     8    13    21    34    55    89   144   233   377   610   987
票数 1
EN

Stack Overflow用户

发布于 2017-04-10 19:40:53

为fibonacci函数创建一个M文件并编写代码,如下所示

代码语言:javascript
运行
复制
function [ result ] = fibonacci( n )

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

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

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

代码语言:javascript
运行
复制
for n = 0:10
    fprintf('Fibonacci(%d)= %d\n', n, fibonacci(n));
    end

产出:-

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22222001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档