Re: [讨论] for循环数随输入的数字而变

楼主: profyang (prof)   2014-08-10 20:07:40
※ 引述《ches51311 (游泳迪)》之铭言:
: 嗨嗨各位好 这是小弟我第一次发文
: 问题是这样的 我有1 2 3 4 5 6 六个数字
: 希望能找出所有后一数比前一数大于或小于的排列
: 就像我现在想排三位的 排法就有
: 111 112 113 114 115 116
: 122 123 124 125 126
: 133 134 135 136
: 144 145 146
: .......
: 555 556 566
: 666
: 然后他的循环如下
: a=0;
: x=[];
: for i1=1:6
: for i2=i1:6
: for i3=i2:6
: x(a)=i1*100+i2*10+i3;
: a=a+1;
: end
: end
: end
你确定你这样列出来的就是你前面那堆三位数?
我怎么看你都是把111~666全部列出来啊
: 这样就能求出我的x阵列 每个都是三位数
: 然后现在希望使用者可以输入她想要的位数
: 像如果他输入2的话 就会有如下循环的程式
: a=0;
: x=[];
: for i1=1:6
: for i2=i1:6
: x(a)=i1*10+i2;
: a=a+1;
: end
: end
: 如果输入3 就会有第一个循环的程式
: 于是我就卡关了 不知道怎么让for循环数随着输入值变而变
: (有想过用递回 但没写出来 还是说可以写出来?)
: 因此请教各位大大<(_ _)>
: .....................................................
: 不好意思 我再写详细一点
: 现在题目是 我想写一个函数func(n)
: 然后如果我输入func(1) 会出来阵列x 让
: x(0)=1 x(1)=2 x(2)=3 x(3)=4 x(4)=5 x(5)=6
: 如果输入func(2) 就会出来阵列x 让
: x(0)=11 x(1)=12 x(2)=13 x(3)=14 x(4)=15 x(5)=16
: x(6)=22 x(7)=23 x(8)=24 x(9)=25 x(10)=26
: x(11)=33 x(12)=34 x(13)=35 x(14)=36
: x(15)=44 x(16)=45 x(17)=46
: x(18)=55 x(19)=56
: x(20)=66
: 如果输入func(3) 就会出来阵列x 让
: x(0)=111 x(1)=112 x(2)=113 x(3)=114 x(4)=115 x(5)=116
: x(6)=122 x(7)=123 x(8)=124 x(9)=125 x(10)=126
: x(11)=133 x(12)=134 x(13)=135 x(14)=136
: x(15)=144 x(16)=145 x(17)=146
: x(18)=155 x(19)=156
: x(20)=166
: x(21)=222 x(22)=223 x(23)=224 x(24)=225 x(25)=226
: x(26)=233 x(27)=234 x(28)=235 x(29)=236
: x(30)=244 x(31)=245 x(32)=246
: x(33)=255 x(34)=256
: x(35)=266
: x(36)=333 x(37)=334 x(38)=335 x(39)=336
: x(40)=344 x(41)=345 x(42)=346
: x(43)=355 x(44)=356
: x(45)=366
: x(46)=444 x(47)=445 x(48)=446
: x(49)=455 x(50)=456
: x(51)=466
: x(52)=555 x(53)=556
: x(54)=566
: x(55)=666
: 以此类推 然后像func(1)的程式
: a=0;
: x=[];
: for i1=1:6
: x(a)=i1;
: a=a+1;
: end
: func(2)的程式
: a=0;
: x=[];
: for i1=1:6
: for i2=i1:6
: x(a)=i1*10+i2;
: a=a+1;
: end
: end
: func(3)的程式
: a=0;
: x=[];
: for i1=1:6
: for i2=i1:6
: for i3=i2:6
: x(a)=i1*100+i2*10+i3;
: a=a+1;
: end
: end
: end
: n是多少 for就有多少
: 不过就是不会打会随着n变 for的个数也变的程式 因此请教各位大大
假设是你原文的case 想要从123456抓3个数(可重复)排成3位数xyz
而且x<=y<=z
我会这样写:
M=6; N=3;
[ a3 a2 a1 ]=ndgrid(1:6);
a=[ a1(:) a2(:) a3(:) ]; %到这边为止列出所有111~666 这方法也比你纯用for快
b=unique(sort(a,2),'rows'); %这个想法是把所有123 321的全部重排
%所以321也会变成123 然后再把重复删去 就变成你要的
x=b*(10.^(N-1:-1:0))'; %最后就是你要的x
但是这样仍有你说的问题 因为[a3 a2 a1]这种仍然会随N改变
所以这就是我推文建议的用for循环写成字串然后再用eval执行
具体如下:
%%
str1='[ ';
for ii=1:N
str1=sprintf([str1,'a%d '],N-ii+1);
end
str1=[str1,']=ndgrid(1:M);'];
eval(str1);
%%
str2='a=[ ';
for ii=1:N
str2=sprintf([str2,'a%d(:) '],ii);
end
str2=[str2,'];'];
eval(str2);
%%
b=unique(sort(a,2),'rows');
x=b*(10.^(N-1:-1:0))';
大概就是这样吧
楼主: profyang (prof)   2014-08-11 09:55:00
阿我突然看懂你那堆循环在干嘛了 的确出来是对的
作者: ches51311 (游泳迪)   2014-08-11 15:24:00
跑出来了!! 谢谢^^ 现在在研究sprintf我想问 [str1,'a%d '] 是什么意思@@?
楼主: profyang (prof)   2014-08-11 16:30:00
把str1这个字串和' a%d'这个字串直接接在一起其中%d你看到我后面有个ii 他就会把ii的值填到%d的位置%d是用整数形式所以那个loop的意思就是把前一个str1后面再多接上aii
作者: ches51311 (游泳迪)   2014-08-11 17:30:00
喔喔懂了 跑出[]里的文字 然后%d是变量 由后面给悲剧 用成嘘了==推回来

Links booklink

Contact Us: admin [ a t ] ucptt.com