作者mp19990920 (郝渴连)
看板MATLAB
标题Re: [问题] 利用递回函式产生数列
时间Fri Sep 13 22:09:23 2013
※ 引述《drummerworld (Donkin??Donkey)》之铭言:
: 最近小弟突发奇想一个问题,透过递回函数,
: 试着想把任一长度,用任意两数之间所有的数
: (含这任意两数)。
: 产出所有的排列组合,以下为范例:
: 假设长度为5,任意两数为1和4。
: 产出的情况是:
: 1,1,1,1,1
: 1,1,1,1,2
: 1,1,1,1,3
: 1,1,1,1,4
: 1,1,1,2,1
: .
: .
: 1,1,1,2,4
: 1,1,1,3,1
: .
: .
: .
: 1,4,4,4,4
: 2,1,1,1,1
: .
: .
: .
: 4,4,4,4,4
: 以下我所想的程式如下:
: function T = a(start,end_num,space,tmp,big_T,round)
: %start: 起始值 (如范例中的1)
: %end_num : 终止值(如范例中的4)
: %space : 阵列长度(如范例中的5)
: %tmp : 写入暂时阵列。把目前一整列的执行结果写入这暂时阵列(input为[])
: %big_T : 一个大表格,每一行代表着暂时阵列。执行完结果回传这整张表格(input为[])
: %round : 回合数。用来判断目前在该阵列的那一个段落(input为1)
: if( round <= space )
: for i=start : end_num
: if ((round==1)&&(isempty(big_T)))
: T = a(start,end_num,space,[tmp i], big_T ,(round+1));
: round = round -1 ;
: else
: T = a(start,end_num,space,[tmp i], T ,(round+1));
: round = round-1;
: end
: end
: elseif (round==(space+1)) %终止条件
: big_T = [big_T;tmp];
: T = big_T;
: end
: 用意是希望最後把所有的情况塞在大表格中,并以这表格做为结果回传。
: 不过以 T = a(1,3,4,[],[],1)做为测试,结果是
: ??? Undefined function or variable "T".
: 因此想请问板上大大们可否麻烦指出小弟哪里的逻辑有错
用递回来写matlab不太好,因为:
1. 效能不张
function out = recursive(in)
if in == 1
out = 1;
else
out = in * recursive(in-1);
end
end
tic, recursive(300);, toc
tic, prod(1:300);, toc
你比较一下速度就知道了,
原因似乎是matlab没有做TCO,可参考:
http://stackoverflow.com/questions/5326749/does-matlab-perform-tail-call-optim
ization
2. 要冒着当掉或是卡住的风险
你可以输入 get(0, 'RecursionLimit') 来看看你预设的最大递回阶层,
若你的程式所需要的递回数太接近很容易当掉。
建议您的程式可改成:
dec2base(0:4^5-1, 4) - double('0') + 1
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.67.57.147