重複執行

Download Report

Transcript 重複執行

MATLAB 程式設計入門篇:程式流程控制
練習題

(40%)將「3n+1問題」範例,包裝成函式




自訂一個合法函式名稱
輸入為起始數字,例如123
輸出為「末項=1」的數列,代表其經過的數字
例:threeNPlusOne(13)要回傳:


[13 40 20 10 5 16 8 4 2 1]
提示:



定義列:function out = threeNPlusOne(num)
一開始,先將out設為num:out=num;
將原本印出的部分,改成向量合併:out = [out num];
MATLAB 程式設計入門篇:程式流程控制
練習題

(60%)黑洞數問題(描述)

將一個「位數不完全相同」的四位數字,經過如
下步驟運算,最後將變成「6174」





所有位數「由大排到小」減去「由小排到大」
合法:1234, 0912, 1999,
非法:8888, 4444, ...
範例: 3087 → 8730-0378→ 8352 → 85322358 → 6174 → 7641-1467 → 6174 → ...
本練習題只要求對四位數之計算做設計
MATLAB 程式設計入門篇:程式流程控制
練習題

黑洞數問題(規格)




撰寫一函式計算黑洞數問題,函式名稱自訂
輸入:一合法四位數
輸出:一個向量,從輸入數字開始到黑洞數字為止
例如:blackHoleNum(3087)要回傳:

[3087 8352 6174]
MATLAB 程式設計入門篇:程式流程控制
練習題

黑洞數問題(提示)


假設輸入數字的變數名稱為num
把位數拆開
array = [getDigit(num,1) getDigit(num,2) getDigit(num,3) getDigit(num,4)]



小排到大:xx = sort(array)
大排到小:yy = fliplr(xx)
如何將陣列(變數xx與yy)合併回數字?
num1 = str2num( num2str(xx,'%d%d%d%d') ); % 小的數字
num2 = str2num( num2str(yy,'%d%d%d%d') ); % 大的數字

num = num2 - num1; % 新的數字
MATLAB 程式設計入門篇:程式流程控制
練習題

黑洞數問題(提示)
function out = blackHoleNum(num)
out = num;
while(1)
% 步驟一:拆開num的每一個位數
% 步驟二:小排到大 & 大排到小
% 步驟三:將陣列合併回四位數字,並相減(num = num2-num1)
% 步驟四:向量合併 out = [out num]
% 步驟五:如果num等於6174則break
end
MATLAB 程式設計入門篇:程式流程控制
練習題(加分題)

(3%)修改「九九乘法表」範例,使輸出如下
1*1=
1*2=
1*3=
1*4=
1*5=
1*6=
1*7=
1*8=
1*9=
1
2
3
4
5
6
7
8
9
2*1= 2
2*2= 4
2*3= 6
2*4= 8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18
3*1= 3
3*2= 6
3*3= 9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27
4*1= 4
4*2= 8
4*3=12
4*4=16
4*5=20
4*6=24
4*7=28
4*8=32
4*9=36
5*1= 5
5*2=10
5*3=15
5*4=20
5*5=25
5*6=30
5*7=35
5*8=40
5*9=45
6*1= 6
6*2=12
6*3=18
6*4=24
6*5=30
6*6=36
6*7=42
6*8=48
6*9=54
7*1= 7
7*2=14
7*3=21
7*4=28
7*5=35
7*6=42
7*7=49
7*8=56
7*9=63
8*1= 8
8*2=16
8*3=24
8*4=32
8*5=40
8*6=48
8*7=56
8*8=64
8*9=72
9*1= 9
9*2=18
9*3=27
9*4=36
9*5=45
9*6=54
9*7=63
9*8=72
9*9=81
MATLAB 程式設計入門篇:程式流程控制
練習題(加分題)

(3%, 各6%)分別使用兩層及一層迴圈,完成矩陣乘法



本練習題的目的,在於讓各位熟悉矩陣操作
使用「*」運算元,不需要自己寫迴圈
範例7當中,使用了三層迴圈
MATLAB 程式設計入門篇:程式流程控制
練習題(參考答案)

3n+1問題
function out = threeNPlusOne(num)
out = num;
while(num~=1)
if(0==rem(num,2))
num = num / 2;
else
num = num * 3 + 1;
end
out = [out num];
end
MATLAB 程式設計入門篇:程式流程控制
練習題(參考答案)

黑洞數問題(自行搭配getDigit使用)
function out = blackHoleNum(num)
out = num;
while(1)
array = [getDigit(num,1) getDigit(num,2) getDigit(num,3) getDigit(num,4)];
xx = sort(array);
yy = fliplr(xx);
num1 = str2num( num2str(xx,'%d%d%d%d') );% 小的數字
num2 = str2num( num2str(yy,'%d%d%d%d') ); % 大的數字
num = num2 - num1; % 新的數字
out = [out num];
if(num==6174),break;end
end
MATLAB 程式設計入門篇:程式流程控制
練習題(參考答案)

九九乘法表修改輸出
for i=1:9
for j = 1:9
fprintf('%d*%d=%2d\t',j, i, i*j);
end
fprintf('\n');
end

兩層/一層迴圈矩陣相乘
% 兩層
for i = 1:m
for j = 1:n
C(i,j) = A(i,:)*B(:,j);
end
end
% 一層
for i = 1:n
C(:,i) = A*B(:,i);
end