2

L言語は、次の命令で構成されています。

V <- V
V <- V+-1
IF V != 0 GOTO L, where each instruction may or may not have the label [L]

Lで階乗関数を書くにはどうすればよいですか?

4

1 に答える 1

0

以下では、returnステートメントを使用して関数を記述できると仮定します。それ以外の場合は、すべての関数をインライン化し、ローカル変数に新しい変数を使用し、結果に新しい変数を使用できます。戻り値により、関数本体の後に新しい分岐が発生するはずです。言い換えれば、私は関数/戻り構文を使用して複雑さを軽減しますが、それは言語に力を加えるからではありません。

再帰などを取得することに反対する人もいるかもしれませんが、私はそれを使用していません。ループはGOTOによって実行されます。2番目の引数の符号に基づいて、Subtact / Add関数を1つに組み合わせることができるので、それぞれが他方を呼び出すことに害はありません。これらを組み合わせて、一般的に関数/戻り構文を削除することは、演習として残されています。

(1)符号関数を記述します。0の場合は0、正の場合は1、負の場合は-1を返します。

Sign(X)
 1. Y <- X
 2. Z <- X
 3. if Y=0 GOTO 8
 4. if Z=0 GOTO 10
 5. Y <- Y + 1
 6. Z <- Z - 1
 7. if 0=0 GOTO 3
 8. if Z=0 GOTO 11
 9. return -1
10. return +1
11. return 0

(2)足し算と引き算の関数を書きます。

Add(X, Y)
 1. Sx = Sign(X)
 2. Sy = Sign(Y)
 3. if Sx=0 GOTO 13
 4. if Sy=0 GOTO 14
 5. SyP <- Sy + 1
 6. if SyP=0 GOTO 15
 7. Z <- Y
 8. R <- X
 9. R <- R + 1
10. Z <- Z - 1
11. if Z=0 GOTO 16
12. if 0=0 GOTO 9
13. return Y
14. return X
15. R <- Subtract(X, Y)
16. return R

減算についても同様です。

(3)乗算関数を記述します。

Multiply(X, Y)
 1. Sy = Sign(y)
 2. if Sy=0 GOTO 18
 3. SyP = Sy + 1
 4. if SyP=0 GOTO 12
 5. C <- Y
 6. R <- 0
 7. C <- C - 1
 8. R <- Add(R, X)
 9. if C=0 GOTO 11
10. if 0=0 GOTO 7
11. return R
12. C <- Y
13. R <- 0
14. C <- C + 1
15. R <- Subtract(R, X)
16. if C=0 GOTO 11
17. if 0=0 GOTO 14
18. return 0

(4)階乗関数を記述します。

Factorial(X)
 1. Sx = Sign(X)
 2. if Sx=0 GOTO 11
 3. SxP = Sx + 1
 4. if Sx=0 GOTO 11
 5. R <- 1
 6. C <- X
 7. R <- Multiply(R, C)
 8. C <- C - 1
 9. if C=0 GOTO 12
10. if 0=0 GOTO 7
11. return 1
12. return R

Lの定式化に厳密に従うために、これらをマッサージする必要があるかもしれませんが、アイデアは正しいです(私が紹介したモジュロ愚かなエラー、この言語で初めて書いたもの)。

于 2013-01-28T23:13:09.097 に答える