プログラミング講座(28) 石を取り除く処理(再帰呼び出し)
今回は棋譜ファイルの名前を変更できるようにした他、対局の結果の表示、自動的に石を取り除く処理を追加しました。プログラムIDはHHF931-2です。例によってシステムがコメントにした行は元に戻してお使いください。
対局の結果はウィンドウのタイトル部分に表示されますが、v0.6ではまだ地の計算ができていません。アゲハマの数のみ計算して表示しています。
今回追加した石を取り除く処理では、再帰呼び出しというサブルーチンの呼び出し方法を使いました。これは自分自身を呼び出す手法です。通常、再帰呼び出しを使う言語(cやJava)にはローカル変数と呼ばれるサブルーチンの中だけで使われる変数があり、呼び出されるたびに変数が作られるので、上書きされることがありません。しかし、Small Basicではすべての変数がグローバルな変数なので、壊されないように工夫する必要があります。
以下は再帰呼び出しでよく使われる階乗の計算例です。n! = (n - 1)! × n なので、それをそのままプログラミングしています。Small Basicだと変数の n が壊れてしまうので、自分自身を呼び出す前にスタックへのプッシュとポップを使って変数を保存しておきます。
【リスト10 再帰呼び出しの例 - 階乗の計算】
1 ' Factorial - recursive call sample
2
3 While "True"
4 TextWindow.Write("? ")
5 n = TextWindow.Read()
6 If n < 1 Then
7 Goto exit
8 EndIf
9 Factorial()
10 TextWindow.WriteLine(n + "! = " + f)
11 EndWhile
12 exit:
13
14 Sub Factorial
15 If n <= 1 Then
16 f = n
17 Else
18 Stack.PushValue("s", n)
19 n = n - 1
20 Factorial() ' ここで再帰呼び出し
21 n = Stack.PopValue("s")
22 f = f * n
23 EndIf
24 EndSub
縦横につながった石(連と呼びます)に接する空点(呼吸点と呼びます)を数え、連の呼吸点が0なら、その連は取られます。連の呼吸点を数える CountLiberty() というサブルーチンが再帰呼び出しになっていて、石がつながっている間はその四方の石を再帰的に調べます。
階乗のように再帰的に定義できるものを計算するときは、この再帰呼び出し(recursive call)が便利です。
(つづく)
| 固定リンク
「囲碁」カテゴリの記事
- ディープラーニング(2017.01.07)
- 最近のコンピュータ囲碁(2016.03.05)
- JavaScript (38) 碁盤にもなる囲碁シミュレーター(2015.10.28)
- フリーソフト紹介:囲碁クエスト(2015.08.26)
- C++ (7) CgfGoBan のインストール(2015.01.17)
「Small Basic」カテゴリの記事
- プログラミング講座 (202) 1次元セルオートマトン(2020.09.20)
- プログラミング講座 (201) パラメーター(2020.09.14)
- プログラミング講座 (200) 3次ベジエ曲線(2020.09.14)
- プログラミング講座 (199) スーパー三角関数?(2020.09.02)
- プログラミング講座 (198) スーパー楕円(2020.09.01)
コメント
光次さん、説明不足で申し訳ありません。このプログラムHHF931-2はリモート(smallbasic.com)ではFileに関する部分がコメントになっているので動きません。ローカル(Small Basic IDE)にインポートして コメントを元に戻してから実行してください。
投稿: たかはしのんき | 2013/10/07 23:06
"sBuf"という変数が認識できないようです。
投稿: 光次 | 2013/10/06 20:41
the useful ideas you presented do help the investigation for our company, thanks.
- John
投稿: Private Krankenversicherung Vergleich | 2010/08/31 21:45