メールマガジン・新着情報一覧
- TOP
- メールマガジン・新着情報一覧
- E-0156.再帰呼び出しによる階乗計算の実装— T.Y
2024.02.28
E-0156.再帰呼び出しによる階乗計算の実装— T.Y
◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ 再帰呼び出しによる階乗計算の実装 発行:エスオーエル株式会社 https://www.sol-j.co.jp/ 連載「測定の新常識!?SOLがお伝えするノウハウ!」 2024年2月28日号 VOL.155 平素は格別のお引き立てを賜り、厚く御礼申し上げます。 座標測定機による精密測定やアプリケーション開発情報などをテーマに、 無料にてメールマガジンを配信いたしております。 ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ こんにちは、こんばんは。 エスオーエル株式会社 営業技術グループの米村です。 前回の私担当のメルマガではWerth社の アプリケーションである WinWerth にて使用される、 DMIS という言語でバブルソートを実装いたしました。 今回は「DMISにおいて再帰呼び出しは使えるのだろうか?」 ということが気になりましたので実験してみました。 実験の前に簡単に再帰呼び出しについて説明します。 再帰呼び出しというのは、プログラムでの関数の作り方のひとつです。 F という関数の中で更に引数を少し変えて再び同じ F の関数を呼び出す という処理を繰り返すものになります。 今回は再帰呼び出しを学ぶ際にポピュラーな階乗計算をしてみます。 例えば整数 N=5 の階乗を求める場合は 5! = 5x4x3x2x1 = 120 となります。 これを再帰で実現する場合の処理は次の通りです。 1) 関数 F に引数 5 を与えて呼び出す。 2) 1*5=5 を計算し T に格納。 3) 関数 F に引数 5-1 を与えて呼び出す。(再帰呼び出し) 4) 5*4=20 を計算し T に格納。 5) 関数 F に引数 4-1 を与えて呼び出す。(再帰呼び出し) ・ ・ ・ 引数 0 の場合関数を抜ける。 上記の計算を繰り返すことにより 5x4x3x2x1 の計算を実現し 5 の階乗を得ることが出来ます。 この計算を DMIS にて下記のように実装してみました。 ----------------------------------------- MACRO / Factorial IF / ($CALLARG[0] = 0) , (Return) LET / $tmp = $tmp * $CALLARG[0] CALL / Factorial , $CALLARG[0]-1 (Return) ENDMAC DECL / INT, Num, tmp LET / $Num = 5 LET / $tmp = 1 CALL / Factorial, $Num TEXT / OUTPUT, '$Num! = $tmp' ENDFIL ----------------------------------------- MACRO が DMIS での関数の定義です。 Factorial という関数の中で更に「CALL / Factorial…」と 同じ関数を呼び出しているのが見て取れると思います。 これが再帰関数になります。 そして実行後の出力結果は以下となります。 --------------- 5! = 120 --------------- 問題なく実行することができ、計算結果も問題なく得られ DMIS で再帰呼び出しが使えることがわかりました! これでまた DMIS で作れる処理の幅が広がります! これにて今回の内容は以上となります。 最後までお読みいただきありがとうございました。 -- T.Y