我正试图编写一个程序,在不使用任何MATLAB内置函数的情况下,接受用户的输入(n(并输出斐波那契序列的第n项。我目前已经编写了以下函数,但是,我希望稍微修改一下这个代码,以便n=input("Enter value of n")
,但是我不确定如何进行?我需要声明一个名为fib1的空数组吗?
function f = fib1(n)
if n <= 1
f = 1;
else
f = fib1(n-1) + fib1(n-2);
end
end
Fibonacci序列由一个差分方程定义,该方程等价于递归离散时间filter
:
>> n = 10;
>> result = [1 filter([1 1], [1 -1 -1], [1 zeros(1,n-2)])]
result =
1 1 2 3 5 8 13 21 34 55
您可以通过首先查询输入参数的实际数量(nargin
(并分别处理以下两种情况来轻松修改函数:
function f = fib1(n)
if nargin<1
n = input('input n:');
f = fib1(n);
else
if n <= 1
f = 1;
else
f = fib1(n-1) + fib1(n-2);
end
end
end
在线试用!
更好的方法是将函数放在一个单独的fib.m
文件中,并从另一个文件中调用它,如下所示:
n = input("Enter value of n")
result = fib(n)
此外,您还可以改进Fibonacci代码的性能,如下所示:
function f = fib(n)
res = ones(1, n + 1);
for i = 3:(n + 1)
res(i) = res(i - 1) + res(i - 2)
end
f = res(n + 1)
我只是想把它添加到这里。。。
可以在不使用递归的情况下找到斐波那契序列的第n项。(存在一个封闭形式的解决方案。(我不一定期望这个答案被接受,只是想证明在不使用递归的情况下找到斐波那契序列的第n项是可能的。
试试这个功能。这是我很久以前做的。我还添加了一些代码,如果输入是整数,则将输出四舍五入到最接近的整数。我发现这是必要的,因为有时由于计算机对无理数进行舍入,舍入会导致闭合形式的解决方案无法生成整数。
function x = fib(n)
%FIB Fibonacci sequence.
% X = FIB(N) returns the Nth term in the Fibonacci sequence, which is
% defined in the following way:
%
% FIB(N+2) = FIB(N+1) + FIB(N) , FIB(0) = 0 , FIB(1) = 1
%
% The closed form solution to the Fibonacci sequence is:
%
% N N
% / 1 + SQRT(5) / 1 - SQRT(5)
% | ----------- | - | ----------- |
% FIB(N) = 2 / 2 /
% ------------------------------------
% SQRT(5)
%
% Although this formula is only physically meaningful for N as an
% integer, N can be any real or complex number.
r = sqrt(5);
x = (((1+r)/2).^n-((1-r)/2).^n)/r;
for l = numel(n)
if isequal(mod(n(l),1),0)
x(l) = round(x(l));
end
end
end
您可以定义一个使用n=input("Enter value of n");
的函数。然后让Fibonacci序列f = fib2(n);
的第n项的计算在该函数内。
function f = fib1()
n = input('Enter value of n: ');
f = fib2(n);
function f = fib2(n)
if n <= 1
f = 1;
else
f = fib2(n-1) + fib2(n-2);
end
end
end