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