PR
更新:2024/11/08

【Octave】ループ処理・for・while・continue・練習問題について

はるか
はるか
ループ処理は、コードを簡潔にまとめるために便利。無駄な繰り返しを避けられる。
ふゅか
ふゅか
そうね、例えば `for` ループを使えば、指定した回数だけ繰り返すことができるわ!Octaveではどう書くのか見ていきましょう!

1. ループ処理の使い方

Octaveでのループ処理は、for ループや while ループを使用して実行できます。以下にそれぞれの例を示します。

1.1. forループ

ふゅか
ふゅか
たとえば、Octaveで5回繰り返すには、「for i = 1:5」みたいな感じになるよ。

for ループを使用すると、指定された回数だけループ処理を繰り返すことができます。

% forループの例
for i = 1:5
  disp(['This is iteration number ', num2str(i)]);
end

このスクリプトは、i が 1 から 5 までの値を取るごとに、ループの中の処理を実行します。disp 関数を使って現在のイテレーション番号を表示しています。

1.2. whileループの例

while ループは、条件が真である限り、ループ処理を繰り返します。

% whileループの例
i = 2;
while i <= 10
  disp(['This is iteration number ', num2str(i)]);
  i = i*i;
end

このスクリプトでは、変数 i が 10 以下である限り、ループが繰り返されます。例ではiの二乗が10以下である限り、ループ処理が行われます。

はるか
はるか
条件に応じて繰り返しを制御するなら、`while` ループが適している。

1.3. breakとcontinueの使用例

はるか
はるか
処理の途中でループを抜けたい時や、特定の条件で次のループに進みたいときは?
ふゅか
ふゅか
その場合は、`break` や `continue` を使うのが便利だね![/code block]

breakcontinue を使って、ループの中断や次のイテレーションへのスキップを行うことができます。

% break と continue の例
for i = 1:10
  if i == 6
    break; % iが6になったらループを終了
  elseif mod(i, 2) == 0
    continue; % iが偶数の場合、残りの処理をスキップして次のイテレーションへ
  end
  disp(['Odd iteration number: ', num2str(i)]);
end

この例では、i が偶数のときに continue によって残りの処理がスキップされ、i が6になった時点で break によってループが終了します。

2. 練習問題

2.1. フィボナッチ数列を計算する

Octaveで$a_{20}$までのフィボナッチ数列を計算しなさい。フィボナッチ数列の漸化式は次のようになっているとする。

$$a_{n+1} = a_n + a_{n-1}$$

$$a_1=0,a_2=1$$

n = 20;
a = zeros(1, n); % サイズnの0で初期化された配列を作成
a(1) = 0;       % 初期条件 a_1 = 0
a(2) = 1;       % 初期条件 a_2 = 1

for i = 3:n
    a(i) = a(i-1) + a(i-2); % 漸化式を適用
end

disp(a) % 結果を表示

このコードは、最初にサイズ20の0で初期化された配列を作成し、初期条件を設定します。次に、漸化式に基づいて配列の各要素を計算し、最終的に結果を表示します。

2.2. 数列の最大公約数 (GCD) を求める

Octaveで60, 90, 120の最大公約数を求めよ。
numbers = [60, 90, 120];
gcd_value = numbers(1);

for i = 2:length(numbers)
    gcd_value = gcd(gcd_value, numbers(i));
end

disp(['数列の最大公約数は: ', num2str(gcd_value)]);

このコードは、まず最初の数を基準として設定し、次に他の数と順番に最大公約数を計算します。最終的な最大公約数を表示することで、60, 90, 120の3つの数に共通する最大の正の整数を得ることができます。