あまり回さない「たらい回し関数」
「たらい回し関数」で 検索すると いくつか記事がありますが、「たらい回し関数」の再帰呼び出し回数が 飛躍的に大きくなるのは、同じ結果を何度も再計算しているからで、一度計算した結果を保存し参照すれば、圧倒的に 再帰呼び出し回数が減る。ことが分かります。
日本語プログラミング言語mind8で試してみましたので ご覧ください。
Mindプログラム
tarai2.src
呼び出し回数は 変数。
たらい回し結果構造体は 構造体
結果は ワード変数
一次元は 102個の 結果
二次元は 102個の 一次元
全体は 102個の 二次元。
たらい回し結果有構造体は 構造体
結果有は ワード変数
一次元有は 102個の 結果有
二次元有は 102個の 一次元有
全体は 102個の 二次元有。
たらい回しとは
xは 変数
yは 変数
zは 変数
x2は 変数
y2は 変数
z2は 変数
たらい回し結果は ワード変数
xと yと zに 入れ
xに 2を 加え x2に 入れる
yに 2を 加え y2に 入れる
zに 2を 加え z2に 入れる
呼び出し回数を 一つ増加し
結果有(x2,y2,z2) ならば
結果(x2,y2,z2)を 返し 終わり
つぎに
結果有(x2,y2,z2)に 1を 入れる
xが y 以下
ならば
yを 結果(x2,y2,z2)に 入れる
yを 返し
さもなければ
[x - 1]と yと zを たらい回し
[y - 1]と zと xを たらい回し
[z - 1]と xと yを たらい回し
たらい回しし たらい回し結果に 入れる
たらい回し結果を 結果(x2,y2,z2)に 入れる
たらい回し結果を 返す
つぎに。
メインは
ixは 変数
iyは 変数
izは 変数
起動引数個数が 3と 等しい
ならば
呼び出し回数を クリアし
起動引数(1)を 数値変換し 捨て ixに 入れる
起動引数(2)を 数値変換し 捨て iyに 入れる
起動引数(3)を 数値変換し 捨て izに 入れる
「たらい回し開始します。」と 表示し
ixと iyと izとを
たらい回し 数値表示する
「です。」と 表示し
呼び出し回数を 数値表示する
「回呼び出し」と 表示する
改行する
さもなければ
「起動引数個数は3個です。」と 表示し 改行する
つぎに
。
x,y,z は0以上100以下まで可能です
実行結果
c:\mind8\pmind\lesson>tarai 8 4 0
たらい回し開始します。8です。12605回呼び出し
c:\mind8\pmind\lesson>tarai2 8 4 0
たらい回し開始します。8です。177回呼び出し
c:\mind8\pmind\lesson>tarai 10 5 0
たらい回し開始します。10です。343073回呼び出し
c:\mind8\pmind\lesson>tarai2 10 5 0
たらい回し開始します。10です。297回呼び出し
c:\mind8\pmind\lesson>tarai 12 6 0
たらい回し開始します。12です。12604861回呼び出し
c:\mind8\pmind\lesson>tarai2 12 6 0
たらい回し開始します。12です。449回呼び出し
c:\mind8\pmind\lesson>tarai 14 7 0
たらい回し開始します。14です。588802013回呼び出し
c:\mind8\pmind\lesson>tarai2 14 7 0
たらい回し開始します。14です。633回呼び出し
c:\mind8\pmind\lesson>tarai2 16 8 0
たらい回し開始します。16です。849回呼び出し
c:\mind8\pmind\lesson>tarai2 18 9 0
たらい回し開始します。18です。1097回呼び出し
c:\mind8\pmind\lesson>tarai2 20 10 0
たらい回し開始します。20です。1377回呼び出し
tarai は、純粋に再帰呼び出ししています。
tarai2 が改良版です。
「たらい回し関数の価値」
「たらい回し関数の価値」は、再帰呼び出しの回数が大きいことにありますので、tarai2 が改良版 というのは間違いかも知れませんね。