第19講 ユークリッド互除法
第5話 Functionプロシージャによるユークリッド互除法の解説
コード再掲
Private Sub CommandButton1_Click()
  Dim a As Integer, b As Integer, w As Integer
  a = Cells(3, 5)
  b = Cells(3, 7)
    If a <= b Then
    w = a
    a = b
    b = w
  End If
  Cells(5, 3) = yk(a, b)
End Sub
Function yk(a As Integer, b As Integer)
  a = a Mod b
  If a = 0 Then
    yk = b
    Exit Function
  End If
  yk = yk(b, a)
End Function
Private Sub CommandButton2_Click()
  Range("E3,G3,C5").Select
  Selection.ClearContents
  Range("A1").Select
End Sub

解説
皆さん、yk = yk(b, a)をご覧になり訳がわからないとお感じでしょうか。
そうですよね。
初心者にとっては、理解困難ですよね。
c++ならここは、ここは単純にyk(b, a)です。
なぜ、左辺と右辺にykが出てくるのでしょうか。
でも皆さんは、
w=w+1
などは何の疑問も持ちませんね。
=は数学のイコールと違いむしろ←の法がイメージに近いことは何でも触れてきました。
ですからyk = yk(b, a)yk ← yk(b, a)と理解すればよいのです。

Function yk(a As Integer, b As Integer)
  a = a Mod b
  If a = 0 Then
    yk = b
    Exit Function
  End If
  yk = yk(b, a)
End Function
を1行1行追ってみましょう。
a = a Mod bはaをbで割った余りを改めてaの値にするです。
次の
  If a = 0 Then
    yk = b
    Exit Function
  End If
はそのaの値が0ならbをykと値として、
Functionプロシージャを終了しなさいです。
つまり、この値が呼び出したプロシージャに返されます。
したがって、この場合は
  yk = yk(b, a)
は実行されません。
0でない場合は、
  yk = yk(b, a)
が実行されユークリッド互除法が続けられます。

では具体的に
入門と入力された場合でトレースをしてみましょう。
Private Sub CommandButton1_Click()
  Dim a As Integer, b As Integer, w As Integer
  a = Cells(3, 5)
  b = Cells(3, 7)
    If a <= b Then
    w = a
    a = b
    b = w
  End If
  Cells(5, 3) = yk(a, b)
End Sub
なので、yk(a, b)は yk(154, 48)です。
ということは、
  a = a Mod b

  a = 154 Mod 48
でaの値は10となります。
aの値が0でないので、
  yk = yk(b, a)
によって新しいFunctionプロシージャが呼び出されます。
このときの呼び出しは
  yk = yk(48, 10)
です。
すると入れ子式2番目のFunctionプロシージャ
の1行目で
  a = 48 Mod 10
からa=8となります。
したがって、
  If a = 0 Then
    yk = b
    Exit Function
  End If
は実行されず、
  yk = yk(10, 8)
が実行され入れ子式3番目のFunctionプロシージが呼び出され、
そこの第1行で
  a = 10 Mod 8
が実行されa=2となり、
  If a = 0 Then
    yk = b
    Exit Function
  End If
は実行されず、
  yk = yk(8, 2)
が実行され入れ子式4
番目のFunctionプロシージが呼び出され、
そこの第1行で
  a = 8 Mod 2
が実行されa=0となり、はじめて
  If a = 0 Then
    yk = b
    Exit Function
  End If
が実施され、
入れ子式4番目の人形から入れ子式3番目の人形に2の値が返されます。
すると入れ子式人形3番目の
  yk = yk(10, 8)
によって2の値が入れ子式の1番目の人形に返されます。
さらに、1番目の
  yk = yk(48, 10)
によって、Private Sub CommandButton1_Click()に2が返され、
その値がCells(5, 3)に表示され
vb
となって処理が終わります。





第4話へ 第20講第1話へ

004
  

VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る