2016-03-17 92 views
0

我想实现一个递归函数在向量v添加奇数总结了所有的奇数。 到目前为止,这是我尝试Matlab递归。在矢量

function result = sumOdd(v) 
%sum of odd numbers in a vector v 
%sumOdd(v) 

n = 1; 
odds = []; 

if length(v) > 0 
    if mod(v(n),2) == 1 
     odds(n) = v(n); 
     v(n) = []; 
     n = n + 1; 
     sumOdd(v) 
    elseif mod(v(n),2) == 0 
     v(n) = []; 
     n = n + 1; 
     sumOdd(v) 
    end 

else 
    disp(sum(odds)) 
end 
end 

这并不工作,并返回一个值为零。我是编程和递归新手,想知道我做错了什么。

谢谢。

+1

你必须使用递归吗?在matlab中使用逻辑索引有很多更好的方法。 – Daniel

+1

你永远不会给'result'分配任何东西,你永远不会得到你的递归调用返回的东西。 – Daniel

+0

是的,它必须通过递归来完成。 –

回答

0

您可以随时删除v的第一个元素,而不是保留'n'。此外,您需要传递'odds'作为参数,因为您每次调用时都将其初始化为空数组功能(因此为零输出)。

下面的例子似乎做的工作:

function result = sumOdd(v,odds) 
%sum of odd numbers in a vector v 
%sumOdd(v) 

if ~isempty(v) 
    if mod(v(1),2) == 1 
     odds = [odds;v(1)]; 
     v(1) = []; 
     sumOdd(v,odds) 
    elseif mod(v(1),2) == 0 
     v(1) = []; 
     sumOdd(v,odds) 
    end 

else 
    disp(sum(odds)) 
end 
end 
+0

感谢您的答复,是否有一种方法来实现sumOdd只有一个输入参数? –

+0

@Nibor:你从来没有给'result'分配任何东西,那不是递归的工作方式。 – Daniel

2

有一个在MATLAB来解决这个更好的方法:

function result=summOdd(v) 
    odd_numbers=v(mod(v,2)); % Use logical indexing to get all odd numbers 
    result=sum(odd_numbers); % Summ all numbers. 
end 

举一个递归解决方案:

实施当一个递归函数,你应该始终遵循一个模式。首先从递归停止的简单情况开始。在这种情况下,空列表的总和是0:

function result = sumOdd(v) 
%sum of odd numbers in a vector v 
%sumOdd(v) 


if length(v) == 0 
    result=0; 
else 
    %TBD 

end 
end 

我总是开始这样想我的代码时要避免无限递归。如果%TBD被放置,你必须把你的实际递归。在这种情况下,您的想法是处理第一个元素,并将所有剩下的部分放入递归中。首先编写一个变量s,如果第一个元素是偶数,则该变量包含0,当奇数时包含第一个元素本身。这样,您就可以使用result=s+sumOdd(v)

function result = sumOdd(v) 
%sum of odd numbers in a vector v 
%sumOdd(v) 

if length(v) == 0 
    result=0; 
else 
    if mod(v(1),2) == 1 
     s=v(1); 
    else 
     s=0; 
    end 
    v(1) = []; 
    result=s+sumOdd(v); 
end 
end 

现在有你的代码完成后,读黄色预警编辑器提供给您计算的结果,它会告诉你用isempty(v)取代length(v) == 0