2016-03-17 87 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