logo

logo

メールマガジン・新着情報一覧

  1. TOP
  2. メールマガジン・新着情報一覧
  3. 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

一覧に戻る

お問い合わせ Contact

048-441-1133

お問合せフォーム