PR
更新:2024/09/10

Octaveの関数定義・function ・return・練習問題について

ふゅか
ふゅか
Octaveでは、関数を定義して使えるのよ!同じ処理を何度も行うときに、関数を使うととても効率的になるわ。
はるか
はるか
たしかに。関数を使うと、同じコードを繰り返し書かなくて済む。

1. 関数の定義

Octaveでは、関数はfunctionキーワードを使用して定義します。関数の定義の基本的な構文は以下の通りです。

function [return_var1, return_var2, ...] = function_name(input_var1, input_var2, ...)
    % 関数内のコード
    return_var1 = ...;
    return_var2 = ...;
    ...
end
  • function_name は関数名を指定します。
  • input_var1, input_var2, … は関数に渡される入力引数を指定します。
  • return_var1, return_var2, … は関数が返す出力変数を指定します。出力が1つだけの場合、[] は省略できます。
  • 関数の本体は、function キーワードと end の間に書かれます。
はるか
はるか
Octaveで関数を定義するのは、functionキーワードを使う。
ふゅか
ふゅか
そうね!あと、返り値は関数名の前に[]に書くのよ!

1.1. 簡単な関数の和を計算する例

例えば、2つの数の和を計算する関数をadd_numbers.mに定義してみましょう。

function sum = add_numbers(a, b)
    sum = a + b;
end

この関数は、2つの入力引数 ab を受け取り、それらの和を計算して sum として返します。

上記で定義した add_numbers 関数を別ファイルやCUIで呼び出すことができます。

result = add_numbers(3, 5);
disp(result);  % 結果として 8 が表示されます

一応、ディレクトリは次のようになっています。main.mにさっきのadd_numbers 関数を呼び出すスクリプトを書いています。

はるか
はるか
ファイル名と関数名は同じにする必要がある。

1.2. 複数の出力を持つ関数

複数の出力を持つ関数も定義できます。例えば、2つの数の和と積を計算する関数を以下のように定義できます。

function [sum, product] = calculate_sum_and_product(a, b)
    sum = a + b;
    product = a * b;
end

この関数を使用するには、以下のようにします。

[s, p] = calculate_sum_and_product(3, 5);
disp(s);  % 結果として 8 が表示されます
disp(p);  % 結果として 15 が表示されます

sには3+5、pには3*5が計算した結果が返り値として格納されます。

1.3. returnの使い方

Octaveで関数のreturn文は、関数の実行を終了し、結果を呼び出し元に返すために使用されます。ただし、return文を明示的に書かなくても、Octaveでは関数の最後に評価された式が自動的に返されます。

次のように関数の定義の中で、return文を使って任意のタイミングで関数の実行を終了し、特定の値を返すことができます。

function result = myFunction(x)
    if x < 0
        result = 0;
        return; % xが負の場合、0を返して終了
    endif
    result = x^2; % xが0以上の場合、その二乗を返す
end
  • 関数が特定の条件を満たした場合に早期に終了させたいときに使います。
  • returnを使わない場合、関数の最後に評価された値が自動的に返されます。

myFunction(2)を実行すると、平方数が計算されて返り値4が返ってきます。

はるか
はるか
ほかのプログラミング言語みたいに返り値を返すわけじゃないから注意。

2. 練習問題

2.1. 問題 1 (基本的な関数定義)

引数として与えられた数値の平方を計算する関数 square_number を定義してください。関数は1つの引数を受け取り、その数の平方を返すものとします。

期待される出力例

square_number(3)
% 9

解答:平方を計算する関数を次のように作成します。

function y = square_number(x)
    y = x^2; % 与えられた数値 x の平方を計算し、y に格納
end

この関数は、引数 x の平方を計算して、その結果を返します。

2.2. 問題 2 (複数の引数を取る関数)

2つの数値を受け取り、その和と積を返す関数 sum_and_product を定義してください。関数は2つの引数を受け取り、2つの出力(和と積)を返すものとします。

期待される出力例

[s, p] = sum_and_product(4, 5)
% s = 9
% p = 20

解答

function [sum, product] = sum_and_product(a, b)
    sum = a + b;         % 2つの数値の和を計算します。
    product = a * b;     % 2つの数値の積を計算します。
end

この関数は、2つの数値 ab を引数として受け取り、その和と積の両方を計算して返します。関数は、返すべき2つの結果をタプルとして返します。

2.3. 問題 3 (条件分岐を含む関数)

引数として与えられた数値が偶数か奇数かを判定する関数 is_even を定義してください。偶数の場合は true、奇数の場合は false を返すものとします。
はるか
はるか
条件分岐も重要。偶数か奇数かを判定する。

期待される出力例

is_even(4)
% true

is_even(7)
% false

解答

function result = is_even(x)
    if mod(x, 2) == 0        % 数値 x を2で割った余りが0であれば偶数です。
        result = true;       % 偶数である場合、結果として true を返します。
    else
        result = false;      % 奇数である場合、結果として false を返します。
    end
end

この関数は、与えられた数値が偶数かどうかを判定します。mod(x, 2)x を2で割った余りを返し、その値が 0 であれば偶数とみなします。

2.4. 問題 4(再帰的関数)

引数として与えられた数値 n の階乗を計算する再帰的な関数 factorial_recursive を定義してください。
ふゅか
ふゅか
再帰的な関数も登場ね!再帰は少し難しいけど、理解できると強力な武器になるわよ!

期待される出力例

factorial_recursive(5)
% 120

解答

function y = factorial_recursive(n)
    if n == 0
        y = 1;                    % n が 0 の場合、階乗の定義により 1 を返します。
    else
        y = n * factorial_recursive(n - 1);  % 再帰的に n の階乗を計算
    end
end

この関数は、与えられた数値 n の階乗を計算します。再帰的に n1 ずつ減らしていき、n = 0 に達した時に再帰が終了します。

2.5. 問題 5 (ベクトルを扱う関数)

ベクトルを引数として受け取り、その要素の合計と平均を返す関数 sum_and_average を定義してください。

期待される出力例

[s, avg] = sum_and_average([1, 2, 3, 4])
% s = 10
% avg = 2.5

解答

function [sum_val, avg_val] = sum_and_average(vec)
    sum_val = sum(vec);       % ベクトルの全要素の合計を計算します。
    avg_val = mean(vec);      % ベクトルの全要素の平均を計算します。
end

この関数は、与えられたベクトルの要素の合計と平均を計算して返します。sum 関数はベクトルの全要素の合計を、mean 関数は平均をそれぞれ計算します。

PR