忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBA】再帰関数で解くフィボナッチ数列!数学的定義をそのままコードにする美学

数学的な美しさを持つ「フィボナッチ数列」。前の2つの数字を足すと次の数字になるというシンプルなルールですが、これをVBAで実装する場合、「再帰(Recursive)」という手法を使うと、驚くほど直感的でエレガントなコードになります。

1. 仕様:フィボナッチ数列とは?

以下のルールで並ぶ数字の列です。プログラミングでは、n番目の数字を求める関数を作成するのが一般的です。

[ ルール ]
・0番目は 0、1番目は 1
・n番目は「(n-1)番目 + (n-2)番目」

[ 数列の例 ]
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

2. アルゴリズム:自分自身を呼び出す「再帰」の構造

ポイント:n=0 または 1 の時は、決まった値を返す

再帰関数とは、関数の中で自分自身を呼び出す手法です。フィボナッチの定義 $F(n) = F(n-1) + F(n-2)$ をそのまま記述できるのがメリットですが、無限に呼び出し続けないよう、n=0 や n=1 の時は計算せずにその値を返すというルールを最初に記述するのが鉄則です。

[ 具体的な動作フロー(n = 4 の場合) ]

Step 1: Fib(4) を呼び出し
Fib(3) + Fib(2) の計算を開始。

Step 2: 枝分かれ
Fib(3) はさらに Fib(2) + Fib(1) に分解される。

Step 3: 最小単位への到達
分解を繰り返し、nが 1 や 0 に到達したら、決まった値(1 や 0)を返す。

Step 4: 合流
返ってきた数値が足し算されながら親へ戻っていき、最終的な答え(3)が導き出される。

3. サンプルコード(そのままコピーOK)

Functionの中で自分自身を呼び出している点に注目してください。非常にスッキリとした記述になります。

' フィボナッチ数を求める再帰関数
Function Fibonacci(n As Long) As Long
    If n <= 0 Then
        Fibonacci = 0                   ' 0の時は0を返す
    ElseIf n = 1 Then
        Fibonacci = 1                   ' 1の時は1を返す
    Else
        ' 自分自身を呼び出して足し算する(再帰)
        Fibonacci = Fibonacci(n - 1) + Fibonacci(n - 2)
    End If
End Function

' 実行用プロシージャ
Sub RunFibonacci()
    Dim i As Long
    For i = 0 To 10
        Debug.Print Fibonacci(i)
    Next i
End Sub

4. 実行結果

イミディエイトウィンドウには、加算の連鎖によって生成された数列が次のように表示されます。

0
1
1
2
3
5
8
13
21
34
55

1. 技術的な補足: 再帰はコードが短くなる一方で、n が大きくなると計算回数が爆発的に増えるという弱点があります。VBAで n = 40 を超えると処理が極端に重くなるため、大きな値を扱う場合は、以前紹介したループ処理で積み上げる方が実用的です。
2. エンジニアの視点: 再帰は「分割統治」というアルゴリズムの基本思想を学ぶのに最適です。Javaなどのモダンな言語でも使われる手法ですが、VBAでこれをサラッと実装できると、論理的思考ができる「いけいけ」なエンジニアとして一目置かれること間違いなしです。


5. まとめ

「n=0, 1ならこの値を返す」という基本さえ押さえれば、複雑な計算も再帰でシンプルに記述できます。フィボナッチ数列のように、定義がそのまま形になるプログラミングの快感をぜひ味わってみてください。用途に応じてループと再帰を使い分けられるようになれば、あなたのエンジニアとしての引き出しは確実に増えるはずです。




PR

【VBA】If文を減らしてスマートに解く!FizzBuzz問題のエレガントな解法

プログラミングの入試問題とも言われる「FizzBuzz」。単純に条件分岐を重ねるだけでも解けますが、コードの美しさと拡張性を意識すると、全く違ったアプローチが見えてきます。今回は、VBA特有の文字列結合を活かした、If文の少ないスッキリとしたコードを解説します。

1. 仕様:FizzBuzz問題のルール

1から指定した数まで順番に数字を数え上げ、以下の条件に従って値を出力します。特に「15のとき」をどう処理するかが、If文を減らす鍵となります。

[ ルール ]
・3の倍数なら 「Fizz」
・5の倍数なら 「Buzz」
・両方の倍数(15の倍数)なら 「FizzBuzz」
・それ以外は 「その数字」 をそのまま表示

2. アルゴリズム:文字列結合による「条件分岐の集約」

重要ポイント:空文字変数に「付け足していく」発想

「15の倍数」を独立した条件として判定するのではなく、3の判定結果と5の判定結果を「結合」させることで、複雑なElseIfを排除します。最後に、変数の中身が空かどうかで数字を表示するか判定するだけの、極めてシンプルな構造です。

[ 具体的なロジック(i = 15 の場合) ]

Step 1: 初期化
変数 res を空にする。

Step 2: 3の倍数判定
15は3で割り切れるので、res に "Fizz" を代入(結合)。

Step 3: 5の倍数判定
15は5でも割り切れるので、res に "Buzz" を追加結合。
結果、res は "FizzBuzz" になる。

Step 4: 最終判定
res が空でないのでそのまま出力。もし空なら数字を出力。

3. サンプルコード(そのままコピーOK)

イミディエイトウィンドウに出力する、If文の使用を最小限に抑えたエレガントな実装例です。

Sub ElegantFizzBuzz()
    Dim i As Long
    Dim res As String

    For i = 1 To 30
        res = "" ' 変数をリセット

        ' 3の倍数なら文字を入れる
        If i Mod 3 = 0 Then res = "Fizz"

        ' 5の倍数なら文字を「付け足す」
        If i Mod 5 = 0 Then res = res & "Buzz"

        ' 文字が入っていればそれを、空なら数字を表示
        Debug.Print IIf(res <> "", res, i)
    Next i
End Sub

4. 実行結果

上記コードを実行すると、イミディエイトウィンドウには以下のように出力されます。15と30の箇所が正しく「FizzBuzz」になっているのが分かります。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

1. 技術的な補足: IIf 関数(Immediate If)を使用することで、条件出力を1行に集約しています。また、3と5の判定を独立させることで、「15のときは…」という重複した条件式を書く必要がなくなり、コードの「DRY(Don't Repeat Yourself)」原則を守っています。
2. エンジニアの視点: この手法は、将来的に「7の倍数のときはWoof」といった条件が追加されても、If文を1行足すだけで対応できる「拡張性」に優れています。多分岐を力技で書くのではなく、データの流れ(パイプライン)を作るような意識で書くのが「いけいけ」なエンジニアへの近道です。


【生物学問題】遠くの細胞へメッセージ!「ホルモン」を攻略

私たちの体には、神経系とは別に「血液」の流れを利用して情報を伝えるシステムがあります。今回は、特定の細胞に指令を届ける情報伝達物質「ホルモン」について学びましょう。

1. 問題:内分泌細胞から分泌される物質

【 問題 】 内分泌細胞で作られ、血液中に分泌されて特定の標的細胞へと運ばれ、体の状態を調節する情報伝達物質を何と呼ぶでしょうか?

① 酵素   ② ホルモン   ③ 神経伝達物質   ④ 抗体

2. 正解:内分泌系に関する正解

正解: ② ホルモン

3. 解説:血液という「郵便」で届く指令

ホルモンは非常に微量で効果を発揮し、体内の恒常性(ホメオスタシス)を保つために働きます。

[ ホルモン伝達の仕組み ]
内分泌:分泌腺から直接血液中へ放出されることを指します(汗などの「外分泌」との違いに注意)。
標的細胞:ホルモンを受け取るための専用の「受容体(レセプター)」を持つ細胞のことです。受容体がない細胞には作用しません。

[ 代表的なホルモンの例 ]
・インスリン(血糖値を下げる)、アドレナリン(血糖値を上げる・興奮)、成長ホルモンなど。

1. 試験のポイント: ホルモンは「血液」によって運ばれるため、全身に行き渡りますが、実際に働くのは「受容体を持つ標的細胞」だけです。この「鍵と鍵穴」のような関係が重要です。
2. バイオインフォの視点: ホルモン受容体の構造解析や、ホルモンが細胞内の遺伝子発現をどう変化させるかの解析(シグナル伝達パスウェイ解析)は、生活習慣病やホルモン依存性疾患の治療薬開発において、膨大なデータベースを活用した研究が行われています。


4. まとめ

「内分泌細胞が分泌し、血液で運ばれる物質=ホルモン」です。神経伝達が「有線(速い)」だとすれば、ホルモン伝達は「無線や郵便(比較的ゆっくり、持続的)」というイメージで捉えると、その役割の違いが分かりやすくなりますよ!

【生物学問題】生命の触媒!「酵素」の働きを攻略

生物の体の中では、常に膨大な数の化学反応が起こっています。これらの反応を、体温程度の低い温度で速やかに進めるために欠かせないのが「酵素(こうそ)」です。

1. 問題:代謝を支える生体触媒

【 問題 】 生体内で起こる多くの化学反応(代謝)において、反応を促進させる触媒として利用される物質を何と呼ぶでしょうか?

① ホルモン   ② 酵素   ③ ビタミン   ④ ミネラル

2. 正解:生体物質に関する正解

正解: ② 酵素

3. 解説:特定の相手とだけ反応する専門家

酵素の多くはタンパク質でできており、非常に高度な選択性(特異性)を持っています。

[ 酵素の3大特徴 ]
生体触媒:自らは変化せず、反応速度だけを劇的に高めます。
基質特異性:鍵と鍵穴のように、特定の物質(基質)としか反応しません。
最適条件:働くのに適した温度(約37度前後)やpH(胃の中なら酸性など)が決まっています。

[ 代表的な例 ]
・アミラーゼ(デンプンの分解)、ペプシン(タンパク質の分解)など。

1. 試験のポイント: 酵素は「触媒」なので、反応が終わればまた次の反応に使われます。消耗品ではなく、使い回される作業員のようなイメージで捉えましょう。
2. バイオインフォの視点: タンパク質の立体構造データ(PDBなど)を解析し、酵素が基質と結合する「活性部位」をコンピュータ上でシミュレーションする「ドッキング解析」は、創薬研究において非常に重要な手法です。酵素の働きを邪魔する薬(阻害剤)の設計などに役立てられています。


4. まとめ

「生体内の触媒=酵素」です。その正体が主にタンパク質であること、そして特定の相手としか働かない「基質特異性」という性質をセットで覚えておきましょう!

【BI技術者認定試験対策】細胞の司令塔を守るバリア!「核膜」を攻略

真核細胞の最大の特徴は、遺伝情報であるDNAが特別な膜に包まれていることです。今回は、核を保護し、物質の出入りをコントロールする「核膜(かくまく)」について整理しましょう。

1. 問題:核を包む構造体

【 問題 】 真核細胞において、内部のDNA(染色質)を細胞質から隔て、核を包んでいる二重の膜のことを何と呼ぶでしょうか?

① 細胞膜   ② 核膜   ③ 核小体   ④ 核板

2. 正解:細胞の構造に関する正解

正解: ② 核膜

3. 解説:二重構造と情報の出入り口

核膜は単なる袋ではなく、高度な検問所の役割を果たしています。

[ 核膜の主な特徴 ]
二重膜構造:内膜と外膜の2枚の生体膜からできています。外膜は「小胞体」へとつながっています。
核膜孔(かくまくこう):膜にある小さな穴です。ここを通って、核内で作られたRNAが細胞質へ出たり、必要なタンパク質が核内に入ったりします。

[ 役割 ]
・大切な設計図(DNA)を細胞質中の化学反応から保護し、転写と翻訳のタイミングや場所を分ける役割を担っています。

1. 試験のポイント: 核膜を持つのが「真核生物」、持たない(核がむき出し)のが「原核生物(細菌など)」です。この分類は生物学の超基本ですので、必ずセットで覚えましょう。
2. バイオインフォの視点: 核膜孔を通る物質の輸送には「核移行シグナル(NLS)」という特定のペプチド配列が関わっています。アミノ酸配列からこのシグナルを予測することで、そのタンパク質が細胞内のどこ(核か細胞質か)で働くかをコンピュータ上で推定することが可能です。


4. まとめ

「核の包み紙は核膜」です。二重膜であること、そして核膜孔という穴があることをセットで理解しておきましょう。細胞の「核」をしっかりイメージできるようになると、その中で起こる転写の仕組みも理解しやすくなりますよ!