2015-03-27 2 views
0

Я пытаюсь найти последовательность фибра, используя рекурсию, но моя функция продолжает давать мне ошибку.Как получить последовательность фибоначчи с помощью рекурсии?

function y = r_nFib(seq, n) 
y = zeros(1,n); 
for m = 1:n 
    y(m) = r_nFib(m); 
end 
if seq == 0 
    y = [0 y]; 
else 
    y = [seq, seq, y]; 
function y = r_nFib(seq, n) 
if n<3 
    y(1:n) = 1; 
else 
    y(n) = r_nFib(n-2) + r_nFib(n-1); 
end 
    y = y(n); 
end 
end 

n - длина последовательности волокон, а seq - начальный номер. Если след равен 0, то это как последовательность собирается начать

y = [0 1 1 2 3 5 8] % first two number will be the 0 and 1 

если след является любой вещью, отличной от 0, то

если сл = 2;

y = [2 2 4 6 10] % first two number will be the seq 

Как исправить мою функцию, чтобы дать мне правильный ответ. Я никогда не использовал рекурсию, и я новичок в этом. Любая помощь могла бы быть полезна.

y = r_nFib(4,10) 
y = [4 4 8 12 20 32 52 84 136 220]; 

спасибо.

+0

Не помещайте локальные функции внутри главной функции; поместите его после «конца» основной функции. Он по-прежнему работает и не будет виден внешним абонентам. – Setsu

+0

У меня по-прежнему появляется сообщение об ошибке с использованием r_nFib (строка 2) Недостаточно входных аргументов. Ошибка в r_nFib (строка 4) y (m) = r_nFib (m); –

+0

Кстати, чтобы быть педантичным, последовательность Фибоначчи _defined_, чтобы иметь начальную пару либо '[0 1]', либо '[1 1]'; любые другие стартовые пары - это Фибоначчи, но не строго Фибоначчи. Различие важно, потому что у них разные свойства (см. [Lucas Number] (http://en.wikipedia.org/wiki/Lucas_number)) – Setsu

ответ

1
function y = r_nFib(seq, n) 

if length(seq) == 1 
    if seq == 0 
     seq = [0, 1]; 
    else 
     seq = [seq, seq]; 
    end 
end 

if length(seq) >= n 
    y = seq; 
else 
    y = r_nFib([seq (seq(end - 1) + seq(end))], n); 
end 
1

Вот решение, которое я напечатал на MATLAB, объясняя рекурсии:


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

Каждая рекурсивная функция имеет 2 части:
1) базового случая: самое низкое значение, что нас интересует оценка. Обычно это идет к нулю или к одному.

if (num == 1) 
    out = 1; 
end 


2) Общий случай: Общий случай, что мы будем называть, пока не достигнем базового варианта. Мы снова вызываем функцию, но на этот раз с 1 меньше, чем предыдущая функция. Это позволяет нам проложить путь к базовому корпусу.

out = num + factorial(num-1); 

Это утверждение означает, что мы будем во-первых вызова функции с 1 меньше, чем это функция; мы начали с трех, следующий вызов начинается с двух, после этого звонок начинается с 1 (который вызывает наш базовый футляр!)

Как только наш базовый чехол будет достигнут, методы «recurse-out». Это означает, что они отскакивают назад, обратно в функцию, которая его назвала, принося все данные из функций ниже нее!
Именно на этом этапе наше суммирование фактически происходит.

Как только исходная функция будет достигнута, мы получим окончательное суммирование.

Например, предположим, что вы хотите суммировать первые 3 целых числа. Первый рекурсивный вызов передается числом 3.

function [out] = factorial(num) 
    %//Base case 
    if (num == 1) 
     out = 1; 
    end 
    %//General case 
    out = num + factorial(num-1); 

Проходя через вызовы функций:

factorial(3); //Initial function call 

//Becomes.. 
factorial(1) + factorial(2) + factorial(3) = returned value 

Это дает нам результат 6!


matlab - Clearer explanation of recursion

Смежные вопросы