【问题标题】:Recursive Function to generate / print a Fibonacci series生成/打印斐波那契数列的递归函数
【发布时间】:2014-03-06 10:41:53
【问题描述】:

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

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

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

>> fibonacci(4)

n 的值为 4,所以第 9 行的执行如下:

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

现在我相信第一个 fibonacci(3) 将被调用 - 因此再次调用 fibonacci(3)

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

第 3 行和第 6 行中的 ifs 会很小心。

但是现在 fibonacci(2) + fibonacci(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 行递归调用斐波那契函数的参数。

例如 n = 4

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

那么 MATLAB 会先调用 fibonacci(3) 还是 fibonacci(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 表达式。

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

【问题讨论】:

  • 我不是 MATLAB 专家,但看这里 mathworks.com/help/matlab/ref/return.html 它说返回已完成,在你的情况下,就像 f = 1 而不是 f(1)=1?我可能错了。
  • 那么在我们的例子中,递归函数将返回什么值' f(4) = fibonacci(3) + fibonacci(2);'将导致返回语句执行后的结果
  • 我认为你需要编辑“return f(1);”和“返回 f(2);” “返回;”。
  • 如果我按照@Divakar 进行替换,仍然会出现同样的错误
  • 我认为您需要将f(1)=1; 更改为f=1;f(2)=2f=2,并且还需要将return f(1)return f(2) 更改为return。最后f(n) = ...f=...;

标签: matlab recursion


【解决方案1】:

试试这个:

 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

【讨论】:

  • 但是,我不得不说这不是最有效的方法!还有其他更有效的方法,例如使用黄金分割率。或者可能是另一个更有效的递归,其中相同的分支不会被多次调用!
  • 谢谢 - 我同意。上面的代码打印了作为参数传递的那个位置的斐波那契数列值 - 是否可以通过递归方法打印完整的斐波那契数列?
  • 这样做似乎不太自然,因为同一个 n 被多次调用。
【解决方案2】:

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

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

【讨论】:

  • 但这会在该位置打印斐波那契数列值 - 是否可以打印完整的斐波那契数列?
【解决方案3】:

为斐波那契函数创建一个 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

【讨论】:

    【解决方案4】:

    创建一个函数,返回整数:

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

    这将返回 n 个数字的斐波那契输出,要打印系列你可以在 swift 中像这样使用这个函数:

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

    它将打印 10 个数字的系列。

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 2012-02-15
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      相关资源
      最近更新 更多