作者tml (流刑人形)
看板MATLAB
標題Re: [問題] 列出所有組合的問題
時間Fri Apr 26 13:41:48 2013
※ 引述《keepaway (走開)》之銘言:
: 老師給了一個正整數array [f_1 ,..., f_n]
: 要我們找出所有可能的組合 array [r_1,....,r_n]
: r_i 要小於等於 f_i , i=1,...,n
: 並且不能用matlab 內建的command
: 整體上只能使用 for if while
: 這邊給個例子
: f=[1 2 3]
: 所有的r=[0 0 0] [0 1 1] [1 0 2] [1 2 1]
: [0 0 1] [0 1 2] [1 0 3] [1 2 2]
: [0 0 2] [0 1 3] [1 1 0] [1 2 3]
: [0 0 3] [0 2 1] [1 2 0]
: [0 1 0] [0 2 2] [1 1 1]
: [0 2 0] [0 2 3] [1 1 2]
: [1 0 0] [1 0 1] [1 1 3]
: 我想了滿久還是沒有想出一個有系統的方法
: 不知道有沒有人可以給我一點建議或是提示
function r=dis(f)
r=zeros(prod(f+1),length(f));
for k=2:prod(f+1)
r(k,:)=rplus(f,r(k-1,:),length(f));
end
end
function rnew=rplus(f,rold,ii)
rnew=rold;
if(rold(ii)==f(ii))
rnew(ii)=0;
rnew=rplus(f,rnew,ii-1);
else
rnew(ii)=rnew(ii)+1;
end
end
如果不能用prod或length其實寫個小迴圈也可,因為懶我還是用了…
zeros是用來宣告變數用的,應該不會不能用才對
其實下面的子函數就是一個用遞迴方法的簡易計數器,在指定的位數加一
先判斷需不需要進位,不需要就直接加,不然就該位歸零自我呼叫在下一位加一
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 129.2.129.163
1F:推 keepaway:OH WOW 我要先來讀一下 有問題再問你 :) 謝謝你 04/26 13:50
2F:→ keepaway:不好意思 老師有希望我們按照給的例子那樣排列 也就是 04/26 13:52
3F:→ keepaway:從最多零的組合到最後沒有零Y 04/26 13:52
4F:→ keepaway:請問想法會差不多嗎? 04/26 13:53
5F:→ keepaway:length 這種小東西應該可以用 :) 04/26 13:55
6F:推 keepaway:原來function 裡面可以call 自己啊 學到了! 04/26 16:43