第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)に表示され
となって処理が終わります。
第4話へ 第20講第1話へ
VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る