2016-01-19 37 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