Matlab имеет дело с Фиббоначи - PullRequest
0 голосов
/ 13 ноября 2009

Ряд Фибоначчи задается следующим образом:

1, 2, 3, 5, 8, 13, 21, ...

Как мне написать скрипт, который вычисляет и печатает n-й член Фибоначчи (для n>2), где n вводится пользователем.

Вот что я пробовал:

n=input('n: ');
while(n < 3)
     disp('must enter number >= 3')
     if(n < 3)
          fprintf('\n\n Please re-insert again!!\n')
          n=input('n: ')
      else (n >=3)
          fibf(n)=fib(n-1)+fibf(n-2); 
     end
end

fprintf('the nth value of n is :  ,fibf(n)')

но не удалось распечатать правильное решение.

Ответы [ 3 ]

3 голосов
/ 17 июля 2010

На самом деле ряд Фибоначчи начинается с 0, поэтому F0 = 0, F1 = 1, F2 = 1 и т. Д. Метод рекурсивной функции чрезвычайно медленный. Вам лучше использовать методы линейной алгебры для его расчета.

l1 = (1+sqrt(5))/2;
l2 = (1-sqrt(5))/2;

S = [l1,l2;1,1];
L = [l1,0;0,l2];
C = [-1/(l2-l1);1/(l2-l1)];
k = 15;
y = S * L^k * C;

fprintf('the %dth Fibbonaci number is : %d\n', k, y(2))

the 15th Fibbonaci number is : 610

Доказательство можно найти здесь .

1 голос
/ 13 ноября 2009

Я бы сделал это так:

n = input('n: ');

fib = zeros(1, n);
fib([1 2]) = [1 2];
for i = 3:n
    fib(i) = fib(i-1) + fib(i-2);
end

fprintf('the %dth Fibbonaci number is : %d\n', n, fib(n))

Или, наоборот, это тоже должно работать:

phi = (1 + sqrt(5))/2;
fibn = round((phi^(n+1) - (1-phi)^(n+1))/sqrt(5));
fprintf('the %dth Fibbonaci number is : %d\n', n, fibn)

В сторону: я обычно определяю первые числа Фибоначчи как 1 и 1, а не 1 и 2.

1 голос
/ 13 ноября 2009

В дополнение к ошибке fprintf, указанной Джеймсом МакНеллисом , вы допустили следующие ошибки:

  1. Строка fibf (n) = ... ссылается на массив с именем fib, а не fibf.

  2. Если пользователь вводит число больше 3, ваш цикл while пропускает вычисление fibf.

  3. Если пользователь вводит число меньше 3 и ему предлагается ввести номер заново, вы все равно пропускаете вычисления, потому что ваш else должен быть else if.

  4. Если вы исправите логические ошибки в ваших функциях while / if / else, вам все равно нужно будет инициализировать fibf (1) и fibf (2), иначе у MATLAB не будет значений для них.

Могут быть и другие ошибки, это те, которые я видел на первый взгляд.

В общем, пошаговое выполнение циклов и логических операторов - лучший способ отладки. MATLAB сообщит вам о глупых ошибках, таких как забвение инициализации fibf или использование переменной, которая не существует, но логику сложно отследить, не переходя строка за строкой. В редакторе попробуйте включить точку останова (нажмите F12 в R2009a) в первой строке. Затем вы можете нажать F10 и шаг за шагом посмотреть, что же происходит (F12 и F10 в окнах, не уверенный, каковы эквиваленты в других ОС).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...