Matlab 教材:函式之中斷

另一個關於函式的新保留字是 return, 它的意思是就此結束這個函式,後面的指令都不再做。

繼續使用 collatz() 函式為例,我們在進行 Collatz 數列計算的時候, 先檢查輸入參數 x 是否符合假設:是一個正整數! 這種動作稱為『驗明輸入』input validation

首先,我們檢查 x 是個「數」,也就是純量,而不是向量或矩陣。 方法是檢查 length(x):若 x 是向量或序列, 則 length(x) 是它的維度;若 x 是矩陣, 則 length(x) 是它的兩個維度中較長的那一個。 所以純量的特徵就是 length(x) 為 1。 如果 x 不是純量,顯示錯誤訊息 (寫在 Matlab 介面上), 並中斷函式。

if (length(x) > 1)
    disp(['Error: input must be a scalar.']);
    return;
end
把上述四句指令安插在 collatz.mfunction 那一列宣告之後,並且在 n=0; 那一列之前。 存檔之後,如果執行
>> x=[1 2 3];
>> collatz(x)
就會得到錯續訊息 Error: input must be a scalar., 而 collatz() 之內尚未執行 n=0;, 所以在此情況下 collatz() 沒有傳回來任何答案; 可以說「答案」是「空集合」。

接著檢查 x 是個整數,方法之一是檢查 floor(x) 是否與 x 相等。 如果不相等,表示 x 不是整數,那也該顯示錯誤訊息,並中斷函式。 此時仍然沒有答案。程式如下:

if (floor(x) ~= x)
    disp(['Error: input must be an integer.']);
    return;
end

最後檢查 x 是個正整數。 函式如果執行到這裡,前面都沒有中斷, 表示 x 必定是個整數。因此,只要檢查它有沒有 > 0 就好:

if (x < 1)
    disp(['Error: input must be a positive integer.']);
    return;
end

如果三段檢查都通過了,表示 x 已經被驗證為合法輸入, 然後就可以開始做 Collatz 數列計算。 整體而言,修改後的 collatz.m 如下:

function n = collatz(x)

if (length(x) > 1)
    disp(['Error: input must be a scalar.']);
    return;
end
if (floor(x) ~= x)
    disp(['Error: input must be an integer.']);
    return;
end
if (x < 1)
    disp(['Error: input must be a positive integer.']);
    return;
end

n=0;
while (x>1) & (n<1000)
    n = n+1;
    if (rem(x,2))
        x = 3*x+1;
    else
        x = x/2;
    end
end

習題

  1. 寫一個函式 nfac() 讓它的輸入是正整數, 如果不合規定就顯示錯誤訊息並停止執行。 如果輸入的數是 1 或者質數,輸出訊息說 The input itself is a prime, 否則的話輸出它的不同質因數個數。 (提示,看看 isprime()factor() 這些 Matlab 外掛函式的線上說明。)
單維彰 (2004/04/29) --- [Prev] [Next] [Up]