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



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
の間に書かれます。

function
キーワードを使う。
1.1. 簡単な関数の和を計算する例
例えば、2つの数の和を計算する関数をadd_numbers.mに定義してみましょう。
function sum = add_numbers(a, b)
sum = a + b;
end
この関数は、2つの入力引数 a
と b
を受け取り、それらの和を計算して 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 (複数の引数を取る関数)
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つの数値 a
と b
を引数として受け取り、その和と積の両方を計算して返します。関数は、返すべき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
の階乗を計算します。再帰的に n
を 1
ずつ減らしていき、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
関数は平均をそれぞれ計算します。