作者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