L言語は、次の命令で構成されています。
V <- V
V <- V+-1
IF V != 0 GOTO L, where each instruction may or may not have the label [L]
Lで階乗関数を書くにはどうすればよいですか?
L言語は、次の命令で構成されています。
V <- V
V <- V+-1
IF V != 0 GOTO L, where each instruction may or may not have the label [L]
Lで階乗関数を書くにはどうすればよいですか?
以下では、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の定式化に厳密に従うために、これらをマッサージする必要があるかもしれませんが、アイデアは正しいです(私が紹介したモジュロ愚かなエラー、この言語で初めて書いたもの)。