2015-10-09 2 views
1

Я написал функцию, которая отображает последовательность Фибоначчи до n-го члена. Код работает нормально, но я хочу сделать два изменения и не знаю, как это сделать.Функция Fibonacci не принимает 0 и не отображает только последний член

Вот мой код:

function [ F ] = get_fib(k) 
    F(1) = 1; 
    F(2) = 1; 
    i = 3; 

    while k >= i; 
     F(i) = F(i-1) + F(i-2); 
     i = i + 1; 
    end 
end 

Первая проблема заключается в том, что код не принимает 0 в качестве входных данных. Я попытался изменить функцию:

function [ F ] = get_fib(k) 
    F(0) = 0; 
    F(1) = 1; 
    F(2) = 1; 
    i = 3; 

    while k >= i; 
     F(i) = F(i-1) + F(i-2); 
     i = i + 1; 
    end 
end 

Но появляется следующее сообщение об ошибке:

Пытался доступ F (0); индекс должен быть положительным целым или логическим.

Ошибка в get_fib (строка 2)
F (0) = 0;

Мне также хотелось бы, чтобы код отображал последний член в последовательности, а не всю последовательность.

Я изменил функцию:

function [ F ] = get_fib(k); 
    F(1) = 1; 
    F(2) = 1; 
    i = 3; 

    while k >= i; 
     F(i) = F(i-1) + F(i-2); 
     i = i + 1; 
    end 

    term = F(k) 
end 

но последовательность его до сих пор назначается ans.

Как я могу принять функцию 0 в качестве аргумента и отображать только последний член последовательности?

ответ

0

Сначала давайте получим вашу функцию для вывода только последнего элемента в последовательности. Вы установка term как это:

term = F(k); 

это хорошо (заметьте, что я добавил, в конце концов, хотя). Но возвращаемое значение от вашей функции - F. Вы должны изменить его на term.

function [ term ] = get_fib(k) 
    %// ^^^^- change this ^-- semicolon not necessary here 

Теперь, для обработки ввода 0, вы можете добавить специальный чек на ноль:

function [ term ] = get_fib(k) 
    if k == 0 
     term = []; 
     return; 
    end 

    while k >= i 
     %//  ^-- semicolon not needed here, either 
    <the rest of your code> 

с запятой после заголовка функции и while заявления ничего не больно, они просто представляют собой пустые утверждения. Но они могут ввести в заблуждение, поэтому лучше их удалить.

Точка с запятой после присвоения term предотвращает вывод строки ans = ... на консоль.

0

Для решения вашей первой проблемы F(0) недействительный звонок. Это связано с тем, что индексация MATLAB начинается с 1. Другими словами, первым элементом матрицы является индекс 1. В MATLAB нет 0-го индекса матрицы. See here for why MATLAB indexing starts from 1. Что я хотел бы порекомендовать для этого, это переместить выходной массив на один индекс.

Таким образом, ваш код функции должен быть:

function [ F ] = get_fib(k) 
k = k + 1 
F(1) = 0; % 0th Fibonacci term 
F(2) = 1; % 1st Fibonacci term 
F(3) = 1; % 2nd Fibonacci term 
i = 4; 

while k >= i 
    F(i) = F(i-1) + F(i-2); 
    i = i + 1; 
end 
    term = F(k) 
end 

Чтобы решить вашу вторую проблему, это будет зависеть от того, что вы хотите. Вы (1) хотите, чтобы последний член в последовательности возвращался, когда вы вызываете term = get_fib(k), или (2) хотите, чтобы последний член последовательности отображался, и вся последовательность, которая должна быть возвращена?

Для достижения (1) исправьте верхнюю строку вашего кода до function term = F(k). Для достижения (2) вызовите функцию с помощью F = get_fib(some_number), как указано в @rayryeng.

0

Поскольку другие уже указывали, как исправить свой код, я хотел бы показать вам один подход для расчета п-й число Фибоначчи, не полагаясь на F (п-1) и F (n- 2) расчет условий.

Он связан с золотым соотношением, и вы можете больше узнать о его связи с последовательностью Фибоначчи here.

function [ F ] = get_fib(n) 
    % Changed your input variable from k to n (standard notation)  
    Phi = (1+sqrt(5))/2; % Golden ratio value 
    F = round((Phi^n - ((-1)^n)/(Phi^n))/sqrt(5)); %nth fibonacci number 

end 

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

Обратите внимание, что я округлил выход (F), чтобы избежать арифметических ошибок с плавающей запятой.