第34講 ユークリッド互除法△
第5話 ユークリッド互除法コード解説
コード再掲
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
int a,b;
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
int w;
if(a<b){
w=a;
a=b;
b=w;
}
textBox3->Text=(yk(a,b)).ToString();
}
int
yk(int a,int b){
if(a%b==0){
return(b);
}
else{
return(yk(b,a%b));
}
}
};
}
まず、
int w;
if(a<b){
w=a;
a=b;
b=w;
}
では、aの方が小さい場合aとbを交換しています。
大きい方を小さい方で割っていくのがユークリッド互除法です。
関数ykではaをbで割っていますので、
aの方が小さい場合は、交換して交換しておかなければなりません。
交換は一回だけで済みます。
理由は、yk(b,a%b)にあります。
aをbで割った余りは、bより小さいので、()内の前者の方が小さくなることはありません。
また、
int yk(int a,int b){
if(a%b==0){
return(b);
}
else{
return(yk(b,a%b));
}
}
を見ればお分かりのように、遡及(入れ子式人形のより中への旅)は、余りが0になるまで続けられます。
余りが0になったとき初めてreturn(b);で値を返します。
つまり、一番小さい人形が値bを返し、
中から2番目以降の人形は、その値(=一番小さい人形が返した値)を返し続けます。
結果的には、System::Void button1_Clickにおいて、
textBox3->Text=(yk(a,b)).ToString();で一番中の人形が返したbの値が表示されます。
return(yk(b,a%b));にユークリッド互除法が互い違いに割っていくという本質が反映されています。
さて、これに比べると第3話はわかりにくいのですね。
#pragma endregion
private: System::Void button1_Click(System::Object^
sender, System::EventArgs^ e) {
int a,b;
a=int::Parse(textBox1->Text);
b=int::Parse(textBox2->Text);
yk(a,b);
}
void yk(int a,int b){
int w;
if(a<b){
w=a;
a=b;
b=w;
}
a=a%b;
if(a==0){
textBox3->Text=b.ToString();
return;
}
else{
yk(a,b);
}
}
};
}
ですが、これも交互に割っていっています。
ポイントは、a=a%b; にあります。
aをbで割った余りは、bより小さいのでaの方が小さくなります。
ですから、2番目以降の人形では常に
int w;
if(a<b){
w=a;
a=b;
b=w;
}
は働いております。
2番目以降の人形においては、関数が呼び出されたとき常に()内の前者の数字が小さいので、
毎回交換が行われているのです。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)