2014-10-30 2 views
4

Так что у меня небольшая проблема с рекурсией. Я вижу, что есть много вопросов относительно того, как найти последовательность Фибоначчи, используя рекурсию, но я решил это (по большей части) сам по себе. Вместе с тем я пытаюсь найти сумму всех фибоначковых чисел до определенной величины. Например, если я ввожу номер 3, я должен получить четыре. Если я ввод число 10, мой итог должен быть 143. Таким образом, в основном:Вычисление суммы последовательности Фибоначчи с использованием рекурсии MATLAB

Test Cases: 
    out1 = sumFib(3); 
    out1 = 4; 

    out2 = sumFib(10); 
    out2 = 143; 

    out3 = sumFib(28); 
    out3 = 832039 

Я изо всех сил немного понимания, как получить базовый вариант (или прекращения фактор). Вот то, что я до сих пор для моего кода:

function out = sumFib(n) 

if n==1 || n==2 
    out = 1; 
    else 
    out =sumFib(n-1) + sumFib(n-2) ; 
    %// Gives us the value of n-1 and adds it to the value of n-2 

end 

end 

Это дает мне то, что значение числа находится на п-м положении. Для того, чтобы найти общую сумму, я попытался следующие

if n==3 
out = 4 
else 
out = sumFib(n) + sumFib(n - (n-1)) 

Как вы CNA себе представить, это флаги мне с

"Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N) to change the limit. Be aware that exceeding your available stack space can crash MATLAB and/or your computer." 

Я также попытался сделать:

function out = sumFib(n) 

if n==1 || n==2 
    out = 1; 
    else 
    out =(1+sumFib(n-1)) + sumFib(n-2) ; 
    %Gives us the value of n-1 and adds it to the value of n-2 

И с использованием правильного суммарного аспекта для последовательности Фибоначчи

if n==3 
     out = 4; 
    else 
     out = sumFib(n+2)-1; 
end 

Здесь 1 - моя попытка сообщить проблеме, чтобы перейти к следующему номеру, но это не сработает. Если бы кто-нибудь мог лучше объяснить базовое условие для меня и помочь, я был бы признателен.

+2

У вас есть * для использования рекурсии? Где-то в Stackoverflow, я думаю, я видел вексеризованную версию. Возможно, мне снится. – Divakar

+0

Мне нужно использовать рекурсию. Я попытался сделать версию массива на самом деле, но это не совсем сработало с тем, что я пытался сделать. Или я не мог заставить его работать. –

+2

обратите внимание на следующее: https://proofwiki.org/wiki/Sum_of_Sequence_of_Fibonacci_Numbers – Amro

ответ

3

Держите его простым, и разделить функции на две:

function out = fib_sum(n) 
    out = fib(n+2) - 1; 
end 

function out = fib(n) 
    if n < 2 
     out = n; 
    else 
     out = fib(n-1) + fib(n-2); 
    end 
end 

(конечно я предполагаю, что неотрицательные числа целочисленных)

+0

Знаешь, я очень ненавижу, когда я переусердствую. Это в десять раз легче, чем я думал. И это имеет смысл. Я ценю это! –

1

Это похоже на работу, а если вы вводите число один меньше, чем тот, который вы имеете в тестовых случаях -

function out = sumFib(n) 

if n < 2 
    out = n; 
else 
    out = sumFib(n-1) + sumFib(n-2); 
end 
out = 1 + out; 

return; 

хитрость в том, чтобы получить, что суммирование - plus 1 из условного оператора.

Примеров пробегов -

>> out1 = sumFib(2) 
out1 = 
    4 
>> out1 = sumFib(9) 
out1 = 
    143 
>> out1 = sumFib(27) 
out1 = 
     832039 

Конечно, вы можете обернуть его с другой функцией, в которой вы можете сделать это input-integer minus 1 операцию, если вы собираетесь заставить его работать на точные числа, как вы были в вашем тестовые примеры.

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