Нахождение n-го члена последовательности Фибоначчи в Matlab - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь написать программу, которая принимает пользовательский ввод (n) и выводит n-й член последовательности Фибоначчи, без использования встроенных функций MATLAB.В настоящее время я написал следующую функцию, однако, я хотел бы немного изменить этот код, чтобы 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

Ответы [ 5 ]

0 голосов
/ 29 октября 2018

Последовательность Фибоначчи определяется разностным уравнением, которое эквивалентно рекурсивному дискретному времени 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
0 голосов
/ 28 октября 2018

Просто подумал, что я бы добавил это здесь ...

Можно найти 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
0 голосов
/ 28 октября 2018

Вы можете определить функцию, которая принимает n=input("Enter value of n");.Затем пусть вычисляется n-й член последовательности Фибоначчи f = fib2(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
0 голосов
/ 28 октября 2018

Лучший способ - поместить вашу функцию в отдельный файл fib.m и вызвать его из другого файла, например:

n = input("Enter value of n")  
result = fib(n)

также вы можете улучшить производительность кода Фибоначчи, например:

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)
0 голосов
/ 28 октября 2018

Вы можете легко изменить свою функцию, сначала запросив фактическое количество входных аргументов (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

Попробуйте это онлайн!

...