第10講 プロシージャの再帰的使用
第3話 Subプロシージャの再帰的使用による1から10までの和


数独
をSubプロシージャで実現するプログラム例
Dim w As Byte
Private Sub CommandButton1_Click()
  w = 0
  f (1)
End Sub
Sub f(i As Byte)
  w = w + i
  If i < 10 Then
    f (i + 1)
  Else
    Cells(5, 1) = "1から10までの和は"
    Cells(6, 3) = w
    Cells(7, 1) = "です。"
  End If
End Sub

もちろん
Private Sub CommandButton1_Click()
  w = 0
  f (
0)
End Sub
としても結果は同じです。この場合は、
  w = 0
  w = w + 0
  w = w + 1
  w = w + 2
  w = w + 3
  w = w + 4
  w = w + 5
  w = w + 6
  w = w + 7
  w = w + 8
  w = w + 9
  w = w + 10
の計算をしたことになります。
分身の術により11人に分身したことになります。

Subプロシージャだと、グローバル変数を用意しないと、
1から10までの和を求めるプログラムは難しくなります。
例えば、次のようにすればグローバル変数を使わないで
1から10までの和は求められます。
Private Sub CommandButton1_Click()
  Call f(0, 1)
End Sub
Sub f(w As Byte, i As Byte)
  w = w + i
  If i < 10 Then
    Call f(w, i + 1)
  Else
    Cells(5, 1) = "1から10までの和は"
    Cells(6, 3) = w
    Cells(7, 1) = "です。"
  End If
End Sub
尚、
  Call f(0, 1)
などとCallが付いていますが、
引数が複数になる場合Callをつけないとエラーします。
もし、Callをつけたくない場合は、
  f 0, 1
としなければなりません。
私の好みはf(0, 1)なのですが、VBやVBAでは認められていません。
f(0, 1)を使いたいときはCallを付けなければなりません。

上手く工夫すれば、
引数1つでSubプロシージャでも実現できるかも知れませんが、
凡庸な私の頭では思いつきません。
ですが、その私でもFunctionプロシージャなら簡単に実現できます。
皆さん考えてみてください。
ただし、ノーヒントでは難しいので、
CommandButton1_Clickの部分は載せておきましょう。
Private Sub CommandButton1_Click()
  Cells(5, 1) = "1から10までの和は"
  Cells(6, 3) = f(10)
  Cells(7, 1) = "です。"
End Sub
つまり、逆順にプログラムを組むということです。
  w = w + 10
  w = w + 9
  w = w + 8
  w = w + 7
  w = w + 6
  w = w + 9
  w = w + 5
  w = w + 4
  w = w + 3
  w = w + 2
  w = w + 1
  w = 0
このヒントを載せてもかなりの難問です。
皆さんじっくり考えてみてください。




第2話へ 第4話へ



トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ