« プログラミング講座(27) Small Basic検索機能 | トップページ | 蚊に刺されたら… »

2010/08/09

プログラミング講座(28) 石を取り除く処理(再帰呼び出し)

今回は棋譜ファイルの名前を変更できるようにした他、対局の結果の表示、自動的に石を取り除く処理を追加しました。プログラムIDはHHF931-2です。例によってシステムがコメントにした行は元に戻してお使いください。

Igo06
【図23 Igo v0.6 棋譜ファイルを再生したところ】

対局の結果はウィンドウのタイトル部分に表示されますが、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)が便利です。

(つづく)

|

« プログラミング講座(27) Small Basic検索機能 | トップページ | 蚊に刺されたら… »

囲碁」カテゴリの記事

Small Basic」カテゴリの記事

コメント

光次さん、説明不足で申し訳ありません。このプログラム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

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: プログラミング講座(28) 石を取り除く処理(再帰呼び出し):

« プログラミング講座(27) Small Basic検索機能 | トップページ | 蚊に刺されたら… »