3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語Mindの小技 「リカーシブコール」たらい回し関数

Last updated at Posted at 2025-03-20

Mindでもリカーシブコール

Mind でも他のプログラミング言語と同様に、リカーシブコール(再帰呼び出し)が使えます。
リカーシブコールとして有名(?)な、竹内 郁雄先生の「たらい回し関数」をMindでプログラミングし実行してみました。

実行時の注意

各プログラミング言語で実装・実行可能ですが、x,y,z の値によっては 呼び出し回数が膨大になります。
f(2,1,0)で9回、f(4,2,0)で53回、f(6,3,0)で673回、f(8,4,0)で12,605回、f(10,5,0) で343,073回、f(12,6,0)で12,604,861回、f(14,7,0)で588,802,013回
でした。

たらい回し関数の停止性とその値

「たらい回し関数」は、
たらい回し関数f(x,y,z):x,y,z は整数 の定義
f(x,y,z)
= y : x≦yのとき
= f(f(x-1,y,z),f(y-1,z,x),f(z-1,x,y)):x>yのとき

たらい回し関数f(x,y,z)が 任意の整数x,y,zで停止し
ある簡単な関数g(x,y,z)があり。(g は再帰表現なしで記述できます)
f(x,y,z)=g(x,y,z)である。
を証明するのは、結構たいへんです。
いくつか証明がありますが私の証明は、2重の数学的帰納法を使い、40行ぐらいです。
みなさんも g(x,y,z)を見つけて(できれば証明の概略も)コメントに書き込んでください。

大昔、数学セミナーの「エレガントな解答を求む」で出題されましたが、証明は掲載されませんでした。
次回は、g(x,y,z)と停止性の証明を掲載したいと思います。

Mind プログラム

たらい回しとは
      xは  変数
      yは  変数
      zは  変数
      xと  yと  zに  入れ
      xが  y  以下  
            ならば  yを  返し
       さもなければ
                  [x - 1]と  yと  zを  たらい回し
          [y - 1]と  zと  xを  たらい回し
          [z - 1]と  xと  yを  たらい回し
          たらい回しし  返す 
      つぎに。
メインは 
     ixは 変数
     iyは 変数
     izは 変数
	起動引数個数が 3と 等しい
    ならば
  		    起動引数(1)を 数値変換し 捨て ixに 入れる
	 	    起動引数(2)を 数値変換し 捨て iyに 入れる
 		    起動引数(3)を 数値変換し 捨て izに 入れる
        「たらい回し開始します。」と 表示し 改行し 
		    ixと iyと izとを たらい回し  数値表示する
        「です。」と 表示し 改行する
       さもなければ
       「起動引数個数は3個です。」と 表示し 改行する
    つぎに。

実行結果

c:\mind8\pmind\sample>taraimawashi 1 2 3
たらい回し開始します。
2です。
c:\mind8\pmind\sample>taraimawashi 15 10 6
たらい回し開始します。
15です。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?