2016-01-19 77 views
0

所以我試圖編寫一些非常基本的代碼來基本上創建一個基於一定規則的隨機數組。我的最終目標是嘗試獲得一組數字,其中沒有一個匹配。但是,我的代碼輸出的結束數組看起來像數字匹配,我似乎無法弄清楚爲什麼。Matlab遞歸不按照原樣工作

我已經在下面粘貼了一個示例輸出,正如您所看到的,「總計」數組中的一些數字匹配。我猜測我寫了遞歸'addboard'函數的方式有問題,但我不知道什麼是錯的。如果有人能提供一些建議,那會很棒。謝謝。

function [Components,Totals] = BoardForm1() 
BoardLengths = [4,6,8,10,12]; 
Initial = [0,1,2,3,4,5,6,7]; 
Components = zeros(8,14); 
Totals = zeros(8,14); 

for i=1:14 
    for row = 1:length(Initial) 
      [currentboard,test] = addboard(row,BoardLengths,Initial,Totals); 
      Initial(row) = test; 
      Components(row,i) = currentboard 
      Totals(row,i) = test 
    end 
end 
end 


function [currentboard,test] = addboard(x,BoardLengths,Initial,Totals) 
currentboard = BoardLengths(randi(length(BoardLengths))); 
test = Initial(x) + currentboard; 
if ismember(test,Totals) 
    addboard(x,BoardLengths,Initial,Totals); 
end 
end 

Totals = 

12 16 28 34 44 56 68 76 84 94 106 114 118 128 
13 25 35 39 43 49 53 61 65 75 83 91 95 103 
6 18 22 34 42 50 54 66 72 82 86 92 104 112 
15 23 35 41 51 57 63 69 73 81 87 99 105 111 
14 26 36 48 58 68 80 90 100 104 108 114 120 130 
9 13 23 27 31 37 43 49 55 61 65 75 87 91 
12 24 34 42 46 54 60 64 72 76 82 88 92 96 
19 29 33 39 47 57 69 77 83 89 101 109 119 125 

回答

2

MATLAB通過值傳遞,所以在遞歸的addboard中所做的任何更改都會被忽略,因爲忽略它的輸出值。通過設置[currentboard,test]的輸出值來修復= addboard

一般來說,我建議以迭代方式(while循環)而不是遞歸地執行此操作。甚至可能只有一行可以做到這一點,但從評論中我不確定董事會的要求是什麼。

1

我無法理解你的代碼,也許有些評論什麼功能都應該做的將是有益的,但只是在形式上閱讀代碼存在這些線路至少有一個錯誤:

if ismember(test,Totals) 
    addboard(x,BoardLengths,Initial,Totals); 
end 

您打電話addboard沒有輸出參數沒有效果。它應該是:

if ismember(test,Totals) 
    [currentboard,test] = addboard(x,BoardLengths,Initial,Totals); 
end 
+0

嗯,這是有道理的 - 看起來像它的工作!不幸的是,它現在看起來像是達到了500的遞歸限制。 – Alvin

+0

看來你的算法被一個不可能的選擇卡住了,因爲所有選項已經存在於總計中,但是從你的代碼我無法理解你是什麼樣的分配試圖執行。 – Daniel