Matlab递归。求和向量中的所有奇数

时间:2016-03-17 08:44:47

标签: matlab recursion vector

我正在尝试实现递归函数以在向量v中添加奇数。 到目前为止,这是我的尝试

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

这不起作用并返回零值。我是编程和递归的新手,想知道我做错了什么。

谢谢。

2 个答案:

答案 0 :(得分: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

现在您的代码已完成,请阅读编辑器提供给您的黄色警告,它会告诉您将length(v) == 0替换为isempty(v)

答案 1 :(得分:0)

除了保持'n'之外,你总是可以删除v的第一个元素。另外,你需要传递'odds'作为参数,因为你每次调用函数时都将它初始化为一个空数组(因此零输出)。

以下示例似乎可以完成这项工作:

C:\>chcp 65001
C:\>java -jar -Dfile.encoding=UTF-8 path/to/your/runnable/jar