2016-05-23 9 views
0

Как написать хвостовую рекурсивную функцию для вычисления суммы вектора? Функция принимает 2 входных аргумента: вектор v и сумму. Рекурсия хвоста означает, что последняя часть функции должна вызывать себя.Matlab - Рекурсивная векторная сумма хвоста

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

function result = vectorSum(v,sum) 
%takes a vector v and the returns the sum of all elements in the vector 
if length(v) == 0 
    result = 0; 
elseif length(v) == 1 
    result = v; 
else 
    result = vectorSum(v,sum) 
end 
end 

Функция возвращает результат 0 для пустого вектора, и если длина вектора равна 1, то возвращается значение V (1).

+4

Если 'длина (v)> 1', то ваш код ничего не делает, и снова проходит одни и те же входы в себя , Это не может быть правильно! – David

+3

Где вы выполняете 'sum'? Где вы уменьшаете размер 'v' в рекурсии, так что выполнение в конечном итоге завершается? В дополнение к этим комментариям, я скажу, что Matlab, насколько мне известно, не выполняет оптимизацию хвостовой рекурсии, а очень рекурсивный код имеет тенденцию работать хуже, чем итеративный. – TroyHaskin

ответ

2

Ваше решение имеет две основные проблемы:

  1. Результаты не суммируются - Вы просто вызовите функцию vectorSum без учета результата от предыдущих вызовов.
  2. Размер проблемы не уменьшается при каждом рекурсивном вызове.

Существует несколько способов реализации этой рекурсии, я предлагаю следующий подход:

function result = vectorSum(v) 
%takes a vector v and the returns the sum of all elements in the vector 
if length(v) == 0 
    result = 0; 
else 
    result = v(end) + vectorSum(v(1:end-1)); 
end 
end 
+0

@beaker вы правы, я удалил 1 часть состояния. – drorco